@@ -64,6 +64,7 @@ struct recsel_expr_s
64
64
unsigned int not :1 ; /* Negate operators. */
65
65
unsigned int disjun :1 ;/* Start of a disjunction. */
66
66
unsigned int xcase :1 ; /* String match is case sensitive. */
67
+ unsigned int lefta :1 ; /* String match is left anchored. */
67
68
const char * value ; /* (Points into NAME.) */
68
69
long numvalue ; /* strtol of VALUE. */
69
70
char name [1 ]; /* Name of the property. */
@@ -140,6 +141,7 @@ find_next_lc (char *string)
140
141
* Values for <flag> must be space separated and any of:
141
142
*
142
143
* -- VALUE spans to the end of the expression.
144
+ * -^ The substring match is left anchored.
143
145
* -c The string match in this part is done case-sensitive.
144
146
* -t Do not trim leading and trailing spaces from VALUE.
145
147
* Note that a space after <op> is here required.
@@ -176,6 +178,7 @@ recsel_parse_expr (recsel_expr_t *selector, const char *expression)
176
178
int toend = 0 ;
177
179
int xcase = 0 ;
178
180
int notrim = 0 ;
181
+ int lefta = 0 ;
179
182
int disjun = 0 ;
180
183
char * next_lc = NULL ;
181
184
@@ -206,6 +209,7 @@ recsel_parse_expr (recsel_expr_t *selector, const char *expression)
206
209
case '-' : toend = 1 ; break ;
207
210
case 'c' : xcase = 1 ; break ;
208
211
case 't' : notrim = 1 ; break ;
212
+ case '^' : lefta = 1 ; break ;
209
213
default :
210
214
log_error ("invalid flag '-%c' in expression\n" , * expr );
211
215
recsel_release (se_head );
@@ -235,6 +239,7 @@ recsel_parse_expr (recsel_expr_t *selector, const char *expression)
235
239
se -> not = 0 ;
236
240
se -> disjun = disjun ;
237
241
se -> xcase = xcase ;
242
+ se -> lefta = lefta ;
238
243
239
244
if (!se_head )
240
245
se_head = se ;
@@ -463,9 +468,10 @@ recsel_dump (recsel_expr_t selector)
463
468
log_debug ("--- Begin selectors ---\n" );
464
469
for (se = selector ; se ; se = se -> next )
465
470
{
466
- log_debug ("%s %s %s %s '%s'\n" ,
471
+ log_debug ("%s %s %s %s %s '%s'\n" ,
467
472
se == selector ? " " : (se -> disjun ? "||" :"&&" ),
468
473
se -> xcase ? "-c" :" " ,
474
+ se -> lefta ? "-^" :" " ,
469
475
se -> name ,
470
476
se -> op == SELECT_SAME ? (se -> not ? "<>" :"= " ):
471
477
se -> op == SELECT_SUB ? (se -> not ? "!~" :"=~" ):
@@ -529,9 +535,15 @@ recsel_select (recsel_expr_t selector,
529
535
break ;
530
536
case SELECT_SUB :
531
537
if (se -> xcase )
532
- result = !!gnupg_memstr (value , valuelen , se -> value );
538
+ result = (gnupg_memstr (value , valuelen , se -> value )
539
+ && (!se -> lefta
540
+ || (selen <= valuelen
541
+ && !memcmp (value , se -> value , selen ))));
533
542
else
534
- result = !!memistr (value , valuelen , se -> value );
543
+ result = (memistr (value , valuelen , se -> value )
544
+ && (!se -> lefta
545
+ || (selen <= valuelen
546
+ && !memicmp (value , se -> value , selen ))));
535
547
break ;
536
548
case SELECT_NONEMPTY :
537
549
result = !!valuelen ;
0 commit comments