/[pcre]/code/trunk/pcregrep.c
ViewVC logotype

Diff of /code/trunk/pcregrep.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 631 by ph10, Sat Jan 15 11:31:39 2011 UTC revision 632 by ph10, Fri Jul 22 17:47:49 2011 UTC
# Line 935  is used multiple times for the same subj Line 935  is used multiple times for the same subj
935  to find all possible matches.  to find all possible matches.
936    
937  Arguments:  Arguments:
938    matchptr    the start of the subject    matchptr     the start of the subject
939    length      the length of the subject to match    length       the length of the subject to match
940    offsets     the offets vector to fill in    startoffset  where to start matching
941    mrc         address of where to put the result of pcre_exec()    offsets      the offets vector to fill in
942      mrc          address of where to put the result of pcre_exec()
943    
944  Returns:      TRUE if there was a match  Returns:      TRUE if there was a match
945                FALSE if there was no match                FALSE if there was no match
# Line 946  Returns: TRUE if there was a match Line 947  Returns: TRUE if there was a match
947  */  */
948    
949  static BOOL  static BOOL
950  match_patterns(char *matchptr, size_t length, int *offsets, int *mrc)  match_patterns(char *matchptr, size_t length, int startoffset, int *offsets,
951      int *mrc)
952  {  {
953  int i;  int i;
954  size_t slen = length;  size_t slen = length;
# Line 958  if (slen > 200) Line 960  if (slen > 200)
960    }    }
961  for (i = 0; i < pattern_count; i++)  for (i = 0; i < pattern_count; i++)
962    {    {
963    *mrc = pcre_exec(pattern_list[i], hints_list[i], matchptr, (int)length, 0,    *mrc = pcre_exec(pattern_list[i], hints_list[i], matchptr, (int)length,
964      PCRE_NOTEMPTY, offsets, OFFSET_SIZE);      startoffset, PCRE_NOTEMPTY, offsets, OFFSET_SIZE);
965    if (*mrc >= 0) return TRUE;    if (*mrc >= 0) return TRUE;
966    if (*mrc == PCRE_ERROR_NOMATCH) continue;    if (*mrc == PCRE_ERROR_NOMATCH) continue;
967    fprintf(stderr, "pcregrep: pcre_exec() gave error %d while matching ", *mrc);    fprintf(stderr, "pcregrep: pcre_exec() gave error %d while matching ", *mrc);
# Line 1077  while (ptr < endptr) Line 1079  while (ptr < endptr)
1079    {    {
1080    int endlinelength;    int endlinelength;
1081    int mrc = 0;    int mrc = 0;
1082      int startoffset = 0;
1083    BOOL match;    BOOL match;
1084    char *matchptr = ptr;    char *matchptr = ptr;
1085    char *t = ptr;    char *t = ptr;
# Line 1153  while (ptr < endptr) Line 1156  while (ptr < endptr)
1156    than NOMATCH. This code is in a subroutine so that it can be re-used for    than NOMATCH. This code is in a subroutine so that it can be re-used for
1157    finding subsequent matches when colouring matched lines. */    finding subsequent matches when colouring matched lines. */
1158    
1159    match = match_patterns(matchptr, length, offsets, &mrc);    match = match_patterns(matchptr, length, startoffset, offsets, &mrc);
1160    
1161    /* If it's a match or a not-match (as required), do what's wanted. */    /* If it's a match or a not-match (as required), do what's wanted. */
1162    
# Line 1216  while (ptr < endptr) Line 1219  while (ptr < endptr)
1219              }              }
1220            }            }
1221          else if (printname != NULL || number) fprintf(stdout, "\n");          else if (printname != NULL || number) fprintf(stdout, "\n");
1222            /*
1223          matchptr += offsets[1];          matchptr += offsets[1];
1224          length -= offsets[1];          length -= offsets[1];
1225            */
1226          match = FALSE;          match = FALSE;
1227          if (line_buffered) fflush(stdout);          if (line_buffered) fflush(stdout);
1228          rc = 0;    /* Had some success */          rc = 0;                 /* Had some success */
1229            startoffset = offsets[1];
1230          goto ONLY_MATCHING_RESTART;          goto ONLY_MATCHING_RESTART;
1231          }          }
1232        }        }
# Line 1360  while (ptr < endptr) Line 1366  while (ptr < endptr)
1366          fprintf(stdout, "%c[00m", 0x1b);          fprintf(stdout, "%c[00m", 0x1b);
1367          for (;;)          for (;;)
1368            {            {
1369              /*
1370            last_offset += offsets[1];            last_offset += offsets[1];
1371            matchptr += offsets[1];            matchptr += offsets[1];
1372            length -= offsets[1];            length -= offsets[1];
1373              */
1374    
1375              startoffset = offsets[1];
1376              last_offset = startoffset;
1377            if (last_offset >= linelength + endlinelength ||            if (last_offset >= linelength + endlinelength ||
1378                !match_patterns(matchptr, length, offsets, &mrc)) break;                !match_patterns(matchptr, length, startoffset, offsets, &mrc))
1379            FWRITE(matchptr, 1, offsets[0], stdout);              break;
1380              FWRITE(matchptr + startoffset, 1, offsets[0] - startoffset, stdout);
1381            fprintf(stdout, "%c[%sm", 0x1b, colour_string);            fprintf(stdout, "%c[%sm", 0x1b, colour_string);
1382            FWRITE(matchptr + offsets[0], 1, offsets[1] - offsets[0], stdout);            FWRITE(matchptr + offsets[0], 1, offsets[1] - offsets[0], stdout);
1383            fprintf(stdout, "%c[00m", 0x1b);            fprintf(stdout, "%c[00m", 0x1b);

Legend:
Removed from v.631  
changed lines
  Added in v.632

webmaster@exim.org
ViewVC Help
Powered by ViewVC 1.1.12