[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[SCM] GNU M4 source repository branch, branch-1.6, updated. v1.5.89a-88-
From: |
Eric Blake |
Subject: |
[SCM] GNU M4 source repository branch, branch-1.6, updated. v1.5.89a-88-gb9c165b |
Date: |
Tue, 10 Feb 2009 13:20:04 +0000 |
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU M4 source repository".
http://git.sv.gnu.org/gitweb/?p=m4.git;a=commitdiff;h=b9c165b394c06d2da657caae33efd5843689ff3b
The branch, branch-1.6 has been updated
via b9c165b394c06d2da657caae33efd5843689ff3b (commit)
from a1d3d1a7f79b6244e2e8738b2081f8a910026bd4 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit b9c165b394c06d2da657caae33efd5843689ff3b
Author: Eric Blake <address@hidden>
Date: Mon Feb 9 06:16:28 2009 -0700
Enhance index to support starting offset.
* src/builtin.c (m4_index): Add optional third argument.
* NEWS: Document this.
* doc/m4.texinfo (Index macro): Likewise.
(Macro Arguments): Adjust tests.
Signed-off-by: Eric Blake <address@hidden>
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 8 ++++++++
NEWS | 4 ++++
doc/m4.texinfo | 29 ++++++++++++++++++++++++-----
src/builtin.c | 30 ++++++++++++++++++++++++------
4 files changed, 60 insertions(+), 11 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 5763258..b96dccc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2009-02-09 Eric Blake <address@hidden>
+
+ Enhance index to support starting offset.
+ * src/builtin.c (m4_index): Add optional third argument.
+ * NEWS: Document this.
+ * doc/m4.texinfo (Index macro): Likewise.
+ (Macro Arguments): Adjust tests.
+
2009-01-24 Eric Blake <address@hidden>
Add URLs to --help output.
diff --git a/NEWS b/NEWS
index cbea814..bfcb684 100644
--- a/NEWS
+++ b/NEWS
@@ -59,6 +59,10 @@ Software Foundation, Inc.
example of how to recover M4 1.4.x behavior, as well as an example of
simulating the new negative argument semantics with older M4.
+** The `index' builtin now takes an optional third argument as the index
+ to begin searching from, with a negative argument relative to the end of
+ the string.
+
** The `-d'/`--debug' command-line option now understands `-' and `+'
modifiers, the way the builtin `debugmode' has always done; this allows
`-d-V' to disable prior debug settings from the command line, similar to
diff --git a/doc/m4.texinfo b/doc/m4.texinfo
index 37600c4..8341cc9 100644
--- a/doc/m4.texinfo
+++ b/doc/m4.texinfo
@@ -1648,8 +1648,8 @@ index(`abc')
@result{}0
index(`abc',)
@result{}0
-index(`abc', `b', `ignored')
address@hidden:stdin:3: Warning: index: extra arguments ignored: 3 > 2
+index(`abc', `b', `0', `ignored')
address@hidden:stdin:3: Warning: index: extra arguments ignored: 4 > 3
@result{}1
@end example
@@ -1660,7 +1660,7 @@ index(`abc')
@result{}0
index(`abc',)
@result{}0
-index(`abc', `b', `ignored')
+index(`abc', `b', `', `ignored')
@result{}1
@end example
@@ -6113,11 +6113,13 @@ len(`abcdef')
@cindex substrings, locating
Searching for substrings is done with @code{index}:
address@hidden Builtin index (@var{string}, @var{substring})
address@hidden Builtin index (@var{string}, @var{substring}, @ovar{offset})
Expands to the index of the first occurrence of @var{substring} in
@var{string}. The first character in @var{string} has index 0. If
@var{substring} does not occur in @var{string}, @code{index} expands to
address@hidden
address@hidden If @var{offset} is provided, it determines the index at
+which the search starts; a negative @var{offset} specifies the offset
+relative to the end of @var{string}.
The macro @code{index} is recognized only with parameters.
@end deffn
@@ -6142,6 +6144,23 @@ index(`abc', `b')
@result{}1
@end example
address@hidden @acronym{GNU} extensions
+As an extension, an @var{offset} can be provided to limit the search to
+the tail of the @var{string}. A negative offset is interpreted relative
+to the end of @var{string}, and it is not an error if @var{offset}
+exceeds the bounds of @var{string}.
+
address@hidden
+index(`aba', `a', `1')
address@hidden
+index(`ababa', `ba', `-3')
address@hidden
+index(`abc', `a', `4')
address@hidden
+index(`abc', `bc', `-4')
address@hidden
address@hidden example
+
@node Regexp
@section Searching for regular expressions
diff --git a/src/builtin.c b/src/builtin.c
index 6594cb9..a398fdb 100644
--- a/src/builtin.c
+++ b/src/builtin.c
@@ -1828,20 +1828,23 @@ m4_len (struct obstack *obs, int argc, macro_arguments
*argv)
shipout_int (obs, ARG_LEN (1));
}
-/*-------------------------------------------------------------------------.
-| The macro expands to the first index of the second argument in the first |
-| argument. |
-`-------------------------------------------------------------------------*/
+/*-------------------------------------------------------------------.
+| The macro expands to the first index of the second argument in the |
+| first argument. As an extension, start the search at the index |
+| indicated by the third argument. |
+`-------------------------------------------------------------------*/
static void
m4_index (struct obstack *obs, int argc, macro_arguments *argv)
{
const char *haystack;
+ size_t haystack_len;
const char *needle;
const char *result = NULL;
+ int offset = 0;
int retval = -1;
- if (bad_argc (arg_info (argv), argc, 2, 2))
+ if (bad_argc (arg_info (argv), argc, 2, 3))
{
/* builtin(`index') is blank, but index(`abc') is 0. */
if (argc == 2)
@@ -1850,11 +1853,26 @@ m4_index (struct obstack *obs, int argc,
macro_arguments *argv)
}
haystack = ARG (1);
+ haystack_len = ARG_LEN (1);
needle = ARG (2);
+ if (!arg_empty (argv, 3) && !numeric_arg (arg_info (argv), ARG (3), &offset))
+ return;
+ if (offset < 0)
+ {
+ offset += haystack_len;
+ if (offset < 0)
+ offset = 0;
+ }
+ else if (haystack_len < offset)
+ {
+ shipout_int (obs, -1);
+ return;
+ }
/* Rely on the optimizations guaranteed by gnulib's memmem
module. */
- result = (char *) memmem (haystack, ARG_LEN (1), needle, ARG_LEN (2));
+ result = (char *) memmem (haystack + offset, haystack_len - offset, needle,
+ ARG_LEN (2));
if (result)
retval = result - haystack;
hooks/post-receive
--
GNU M4 source repository
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [SCM] GNU M4 source repository branch, branch-1.6, updated. v1.5.89a-88-gb9c165b,
Eric Blake <=