From 52b4524f4e87e16da6fb1475145685299f0febe0 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Mon, 22 Jun 2020 23:29:25 +0200 Subject: po: Avoid regexps when interpreting '\n' sequences. This reduces the execution time of: (call-with-input-file "po/doc/guix-manual.de.po" read-po-file) from 4.7s to 4.0s. * guix/build/po.scm (interpret-newline-escape): New procedure. (parse-tree->assoc): Use it instead of 'regexp-substitute/global'. --- guix/build/po.scm | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'guix') diff --git a/guix/build/po.scm b/guix/build/po.scm index 47ff67541c..6ad7b9cdbc 100644 --- a/guix/build/po.scm +++ b/guix/build/po.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2019 Julien Lepiller +;;; Copyright © 2020 Ludovic Courtès ;;; ;;; This file is part of GNU Guix. ;;; @@ -19,7 +20,6 @@ (define-module (guix build po) #:use-module (ice-9 match) #:use-module (ice-9 peg) - #:use-module (ice-9 regex) #:use-module (ice-9 textual-ports) #:export (read-po-file)) @@ -41,9 +41,19 @@ (and (ignore "\"") (* str-chr) (ignore "\"") (? (and (ignore (* whitespace)) content)))) +(define (interpret-newline-escape str) + "Replace '\\n' sequences in STR with a newline character." + (let loop ((str str) + (result '())) + (match (string-contains str "\\n") + (#f (string-concatenate-reverse (cons str result))) + (index + (let ((prefix (string-take str index))) + (loop (string-drop str (+ 2 index)) + (append (list "\n" prefix) result))))))) + (define (parse-tree->assoc parse-tree) "Converts a po PARSE-TREE to an association list." - (define regex (make-regexp "\\\\n")) (match parse-tree ('() '()) ((entry parse-tree ...) @@ -57,8 +67,8 @@ (('entry ('msgid msgid) 'msgstr) (parse-tree->assoc parse-tree)) (('entry ('msgid msgid) ('msgstr msgstr)) - (acons (regexp-substitute/global #f regex msgid 'pre "\n" 'post) - (regexp-substitute/global #f regex msgstr 'pre "\n" 'post) + (acons (interpret-newline-escape msgid) + (interpret-newline-escape msgstr) (parse-tree->assoc parse-tree))))))) (define (read-po-file port) -- cgit v1.2.3