stdlib: Implement subst function.
authorRichard W.M. Jones <rjones@redhat.com>
Sun, 12 Jan 2020 19:11:04 +0000 (19:11 +0000)
committerRichard W.M. Jones <rjones@redhat.com>
Sun, 12 Jan 2020 19:39:44 +0000 (19:39 +0000)
docs/Goalfile.pod
stdlib/prelude.gl
tests/10-function-subst.gl [new file with mode: 0644]
tests/10-function-subst.sh [new file with mode: 0755]

index da4b142..d58993e 100644 (file)
@@ -12,6 +12,19 @@ Goalfile - introduction, tutorial, and reference for writing goal files
 
 =head1 REFERENCE
 
+=head2 Standard Functions
+
+=head3 subst (from, to, text)
+
+For example:
+
+ subst ("aa", "AA", "aabbccaa") ⇒ "AAbbccAA"
+ subst ("a.*c", "b", "aaacac") ⇒ "bb"
+
+This function works something like make’s C<subst> function, except
+that C<from> is a regular expression, specifically a L<sed(1)>
+extended regular expression.
+
 =head1 SEE ALSO
 
 L<goals(1)>.
index a73ef1a..8315b6f 100644 (file)
@@ -59,6 +59,13 @@ pure function sort (xs) returning strings = @{
     for f in %xs; do echo "$f"; done | sort -u
 }
 
+# Substitute.
+pure function subst (from, to, text) returning string = @{
+    # We need to replace any / characters in ‘to’ with escaped ones.
+    to="$( echo -n %to | sed 's,/,\\/,g' )"
+    echo %text | sed -E s/%from/$to/g
+}
+
 #----------------------------------------------------------------------
 # File functions.
 
diff --git a/tests/10-function-subst.gl b/tests/10-function-subst.gl
new file mode 100644 (file)
index 0000000..4124637
--- /dev/null
@@ -0,0 +1,23 @@
+# Goals test.
+# Copyright (C) 2020 Richard W.M. Jones
+# Copyright (C) 2020 Red Hat Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+# Test the wildcard function.
+
+let s = subst ("a.c", "A/C", "abcdefaacdef")
+
+goal all = { echo %s }
diff --git a/tests/10-function-subst.sh b/tests/10-function-subst.sh
new file mode 100755 (executable)
index 0000000..cbc8907
--- /dev/null
@@ -0,0 +1,24 @@
+#!/usr/bin/env bash
+# Goals test.
+# Copyright (C) 2020 Richard W.M. Jones
+# Copyright (C) 2020 Red Hat Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+set -e
+
+goals -f 10-function-subst.gl > 10-function-subst.out
+test "$(cat 10-function-subst.out)" = "A/CdefA/Cdef"
+rm 10-function-subst.out