From 43fde46778d9fa3e6b308a747d0a74faff2878c4 Mon Sep 17 00:00:00 2001 From: tee3 Date: Wed, 3 Apr 2019 12:19:27 -0400 Subject: [PATCH 1/3] generators: Fix an issue in printing usage requirements debug. (#417) --- src/build/generators.jam | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/generators.jam b/src/build/generators.jam index 4ed8e0c2c..609ab1bbf 100644 --- a/src/build/generators.jam +++ b/src/build/generators.jam @@ -1042,7 +1042,7 @@ local rule try-one-generator-really ( project name ? : generator : target-type generators.dout [ indent ] " " $(targets) ; if $(usage-requirements) { - generators.dout [ indent ] " with usage requirements:" $(x) ; + generators.dout [ indent ] " with usage requirements:" $(usage-requirements) ; } if $(success) From 304dcb656eded40707499c2194b5da3841012c7c Mon Sep 17 00:00:00 2001 From: Steven Watanabe Date: Wed, 3 Apr 2019 11:28:54 -0600 Subject: [PATCH 2/3] Handle empty matches in regex.replace. Fixes #421. --- src/engine/modules/regex.c | 8 +++++++- src/util/regex.jam | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/engine/modules/regex.c b/src/engine/modules/regex.c index d9f8177bf..281e23ad7 100644 --- a/src/engine/modules/regex.c +++ b/src/engine/modules/regex.c @@ -108,7 +108,13 @@ LIST * regex_replace( FRAME * frame, int flags ) { string_append_range( buf, pos, re->startp[ 0 ] ); string_append( buf, object_str( replacement ) ); - pos = re->endp[ 0 ]; + /* Handle empty matches */ + if ( *pos == '\0' ) + break; + else if ( pos == re->endp[ 0 ] ) + ++pos; + else + pos = re->endp[ 0 ]; } string_append( buf, pos ); diff --git a/src/util/regex.jam b/src/util/regex.jam index 766a231a6..483c6220e 100644 --- a/src/util/regex.jam +++ b/src/util/regex.jam @@ -198,6 +198,7 @@ rule __test__ ( ) assert.result " string string" : replace " string string" " " " " ; assert.result "string  string" : replace "string string" " " " " ; assert.result "-" : replace "&" "&" "-" ; + assert.result "x" : replace "" "" "x" ; assert.result "-" "a-b" : replace-list "&" "a&b" : "&" : "-" ; } From e7a54aadeb8df906dfed0a1510bf3565c2521865 Mon Sep 17 00:00:00 2001 From: Steven Watanabe Date: Wed, 3 Apr 2019 14:49:11 -0600 Subject: [PATCH 3/3] Handle zero-length matches in regex.split and fix their handling in regex.replace for non-empty strings. --- src/engine/modules/regex.c | 17 ++++++++++++----- src/util/regex.jam | 4 ++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/engine/modules/regex.c b/src/engine/modules/regex.c index 281e23ad7..e6a7bc9a7 100644 --- a/src/engine/modules/regex.c +++ b/src/engine/modules/regex.c @@ -37,7 +37,7 @@ LIST * regex_split( FRAME * frame, int flags ) OBJECT * s; OBJECT * separator; regexp * re; - const char * pos; + const char * pos, * prev; LIST * result = L0; LISTITER iter = list_begin( args ); s = list_item( iter ); @@ -45,11 +45,18 @@ LIST * regex_split( FRAME * frame, int flags ) re = regex_compile( separator ); - pos = object_str( s ); + prev = pos = object_str( s ); while ( regexec( re, pos ) ) { - result = list_push_back( result, object_new_range( pos, re->startp[ 0 ] - pos ) ); - pos = re->endp[ 0 ]; + result = list_push_back( result, object_new_range( prev, re->startp[ 0 ] - prev ) ); + prev = re->endp[ 0 ]; + /* Handle empty matches */ + if ( *pos == '\0' ) + break; + else if ( pos == re->endp[ 0 ] ) + pos++; + else + pos = re->endp[ 0 ]; } result = list_push_back( result, object_new( pos ) ); @@ -112,7 +119,7 @@ LIST * regex_replace( FRAME * frame, int flags ) if ( *pos == '\0' ) break; else if ( pos == re->endp[ 0 ] ) - ++pos; + string_push_back( buf, *pos++ ); else pos = re->endp[ 0 ]; } diff --git a/src/util/regex.jam b/src/util/regex.jam index 483c6220e..6da5f1e2c 100644 --- a/src/util/regex.jam +++ b/src/util/regex.jam @@ -172,6 +172,8 @@ rule __test__ ( ) assert.result "" a "" b c : split "/a//b/c" / ; assert.result "" a "" b c "" : split "/a//b/c/" / ; assert.result "" a "" b c "" "" : split "/a//b/c//" / ; + assert.result "" a b c "" : split "abc" "" ; + assert.result "" "" : split "" "" ; assert.result a c b d : match (.)(.)(.)(.) : abcd : 1 3 2 4 ; @@ -199,6 +201,8 @@ rule __test__ ( ) assert.result "string  string" : replace "string string" " " " " ; assert.result "-" : replace "&" "&" "-" ; assert.result "x" : replace "" "" "x" ; + assert.result "xax" : replace "a" "" "x" ; + assert.result "xaxbx" : replace "ab" "" "x" ; assert.result "-" "a-b" : replace-list "&" "a&b" : "&" : "-" ; }