/[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 137 by ph10, Thu Mar 29 13:56:00 2007 UTC revision 283 by ph10, Fri Dec 7 19:59:19 2007 UTC
# Line 38  POSSIBILITY OF SUCH DAMAGE. Line 38  POSSIBILITY OF SUCH DAMAGE.
38  */  */
39    
40  #ifdef HAVE_CONFIG_H  #ifdef HAVE_CONFIG_H
41  #  include <config.h>  #include "config.h"
42  #endif  #endif
43    
44  #include <ctype.h>  #include <ctype.h>
# Line 50  POSSIBILITY OF SUCH DAMAGE. Line 50  POSSIBILITY OF SUCH DAMAGE.
50    
51  #include <sys/types.h>  #include <sys/types.h>
52  #include <sys/stat.h>  #include <sys/stat.h>
53    
54  #ifdef HAVE_UNISTD_H  #ifdef HAVE_UNISTD_H
55  #  include <unistd.h>  #include <unistd.h>
56  #endif  #endif
57    
58  #include <pcre.h>  #include "pcre.h"
59    
60  #define FALSE 0  #define FALSE 0
61  #define TRUE 1  #define TRUE 1
# Line 88  enum { DEE_READ, DEE_SKIP }; Line 89  enum { DEE_READ, DEE_SKIP };
89    
90  /* Line ending types */  /* Line ending types */
91    
92  enum { EL_LF, EL_CR, EL_CRLF, EL_ANY };  enum { EL_LF, EL_CR, EL_CRLF, EL_ANY, EL_ANYCRLF };
93    
94    
95    
# Line 141  static int process_options = 0; Line 142  static int process_options = 0;
142    
143  static BOOL count_only = FALSE;  static BOOL count_only = FALSE;
144  static BOOL do_colour = FALSE;  static BOOL do_colour = FALSE;
145    static BOOL file_offsets = FALSE;
146  static BOOL hyphenpending = FALSE;  static BOOL hyphenpending = FALSE;
147  static BOOL invert = FALSE;  static BOOL invert = FALSE;
148    static BOOL line_offsets = FALSE;
149  static BOOL multiline = FALSE;  static BOOL multiline = FALSE;
150  static BOOL number = FALSE;  static BOOL number = FALSE;
151  static BOOL only_matching = FALSE;  static BOOL only_matching = FALSE;
# Line 173  used to identify them. */ Line 176  used to identify them. */
176  #define N_LABEL     (-5)  #define N_LABEL     (-5)
177  #define N_LOCALE    (-6)  #define N_LOCALE    (-6)
178  #define N_NULL      (-7)  #define N_NULL      (-7)
179    #define N_LOFFSETS  (-8)
180    #define N_FOFFSETS  (-9)
181    
182  static option_item optionlist[] = {  static option_item optionlist[] = {
183    { OP_NODATA,    N_NULL,   NULL,              "",              "  terminate options" },    { OP_NODATA,    N_NULL,   NULL,              "",              "  terminate options" },
# Line 188  static option_item optionlist[] = { Line 193  static option_item optionlist[] = {
193    { OP_PATLIST,   'e',      NULL,              "regex(p)",      "specify pattern (may be used more than once)" },    { OP_PATLIST,   'e',      NULL,              "regex(p)",      "specify pattern (may be used more than once)" },
194    { OP_NODATA,    'F',      NULL,              "fixed_strings", "patterns are sets of newline-separated strings" },    { OP_NODATA,    'F',      NULL,              "fixed_strings", "patterns are sets of newline-separated strings" },
195    { OP_STRING,    'f',      &pattern_filename, "file=path",     "read patterns from file" },    { OP_STRING,    'f',      &pattern_filename, "file=path",     "read patterns from file" },
196      { OP_NODATA,    N_FOFFSETS, NULL,            "file-offsets",  "output file offsets, not text" },
197    { OP_NODATA,    'H',      NULL,              "with-filename", "force the prefixing filename on output" },    { OP_NODATA,    'H',      NULL,              "with-filename", "force the prefixing filename on output" },
198    { OP_NODATA,    'h',      NULL,              "no-filename",   "suppress the prefixing filename on output" },    { OP_NODATA,    'h',      NULL,              "no-filename",   "suppress the prefixing filename on output" },
199    { OP_NODATA,    'i',      NULL,              "ignore-case",   "ignore case distinctions" },    { OP_NODATA,    'i',      NULL,              "ignore-case",   "ignore case distinctions" },
200    { OP_NODATA,    'l',      NULL,              "files-with-matches", "print only FILE names containing matches" },    { OP_NODATA,    'l',      NULL,              "files-with-matches", "print only FILE names containing matches" },
201    { OP_NODATA,    'L',      NULL,              "files-without-match","print only FILE names not containing matches" },    { OP_NODATA,    'L',      NULL,              "files-without-match","print only FILE names not containing matches" },
202    { OP_STRING,    N_LABEL,  &stdin_name,       "label=name",    "set name for standard input" },    { OP_STRING,    N_LABEL,  &stdin_name,       "label=name",    "set name for standard input" },
203      { OP_NODATA,    N_LOFFSETS, NULL,            "line-offsets",  "output line numbers and offsets, not text" },
204    { OP_STRING,    N_LOCALE, &locale,           "locale=locale", "use the named locale" },    { OP_STRING,    N_LOCALE, &locale,           "locale=locale", "use the named locale" },
205    { OP_NODATA,    'M',      NULL,              "multiline",     "run in multiline mode" },    { OP_NODATA,    'M',      NULL,              "multiline",     "run in multiline mode" },
206    { OP_STRING,    'N',      &newline,          "newline=type",  "specify newline type (CR, LR, CRLF)" },    { OP_STRING,    'N',      &newline,          "newline=type",  "set newline type (CR, LF, CRLF, ANYCRLF or ANY)" },
207    { OP_NODATA,    'n',      NULL,              "line-number",   "print line number with output lines" },    { OP_NODATA,    'n',      NULL,              "line-number",   "print line number with output lines" },
208    { OP_NODATA,    'o',      NULL,              "only-matching", "show only the part of the line that matched" },    { OP_NODATA,    'o',      NULL,              "only-matching", "show only the part of the line that matched" },
209    { OP_NODATA,    'q',      NULL,              "quiet",         "suppress output, just set return code" },    { OP_NODATA,    'q',      NULL,              "quiet",         "suppress output, just set return code" },
# Line 226  static const char *prefix[] = { Line 233  static const char *prefix[] = {
233  static const char *suffix[] = {  static const char *suffix[] = {
234    "", "\\b", ")$",   ")$",   "\\E", "\\E\\b", "\\E)$",   "\\E)$" };    "", "\\b", ")$",   ")$",   "\\E", "\\E\\b", "\\E)$",   "\\E)$" };
235    
236  /* UTF-8 tables - used only when the newline setting is "all". */  /* UTF-8 tables - used only when the newline setting is "any". */
237    
238  const int utf8_table3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01};  const int utf8_table3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01};
239    
# Line 280  for (;;) Line 287  for (;;)
287    if (strcmp(dent->d_name, ".") != 0 && strcmp(dent->d_name, "..") != 0)    if (strcmp(dent->d_name, ".") != 0 && strcmp(dent->d_name, "..") != 0)
288      return dent->d_name;      return dent->d_name;
289    }    }
290  return NULL;   /* Keep compiler happy; never executed */  /* Control never reaches here */
291  }  }
292    
293  static void  static void
# Line 315  return isatty(fileno(stdout)); Line 322  return isatty(fileno(stdout));
322    
323  /* I (Philip Hazel) have no means of testing this code. It was contributed by  /* I (Philip Hazel) have no means of testing this code. It was contributed by
324  Lionel Fourquaux. David Burgess added a patch to define INVALID_FILE_ATTRIBUTES  Lionel Fourquaux. David Burgess added a patch to define INVALID_FILE_ATTRIBUTES
325  when it did not exist. */  when it did not exist. David Byron added a patch that moved the #include of
326    <windows.h> to before the INVALID_FILE_ATTRIBUTES definition rather than after.
327    */
328    
329  #elif HAVE_WINDOWS_H  #elif HAVE_WINDOWS_H
330    
# Line 326  when it did not exist. */ Line 334  when it did not exist. */
334  #ifndef WIN32_LEAN_AND_MEAN  #ifndef WIN32_LEAN_AND_MEAN
335  # define WIN32_LEAN_AND_MEAN  # define WIN32_LEAN_AND_MEAN
336  #endif  #endif
337    
338    #include <windows.h>
339    
340  #ifndef INVALID_FILE_ATTRIBUTES  #ifndef INVALID_FILE_ATTRIBUTES
341  #define INVALID_FILE_ATTRIBUTES 0xFFFFFFFF  #define INVALID_FILE_ATTRIBUTES 0xFFFFFFFF
342  #endif  #endif
343    
 #include <windows.h>  
   
344  typedef struct directory_type  typedef struct directory_type
345  {  {
346  HANDLE handle;  HANDLE handle;
# Line 416  regular if they are not directories. */ Line 425  regular if they are not directories. */
425    
426  int isregfile(char *filename)  int isregfile(char *filename)
427  {  {
428  return !isdirectory(filename)  return !isdirectory(filename);
429  }  }
430    
431    
# Line 427  return !isdirectory(filename) Line 436  return !isdirectory(filename)
436  static BOOL  static BOOL
437  is_stdout_tty(void)  is_stdout_tty(void)
438  {  {
439  FALSE;  return FALSE;
440  }  }
441    
442    
# Line 545  switch(endlinetype) Line 554  switch(endlinetype)
554      }      }
555    break;    break;
556    
557      case EL_ANYCRLF:
558      while (p < endptr)
559        {
560        int extra = 0;
561        register int c = *((unsigned char *)p);
562    
563        if (utf8 && c >= 0xc0)
564          {
565          int gcii, gcss;
566          extra = utf8_table4[c & 0x3f];  /* Number of additional bytes */
567          gcss = 6*extra;
568          c = (c & utf8_table3[extra]) << gcss;
569          for (gcii = 1; gcii <= extra; gcii++)
570            {
571            gcss -= 6;
572            c |= (p[gcii] & 0x3f) << gcss;
573            }
574          }
575    
576        p += 1 + extra;
577    
578        switch (c)
579          {
580          case 0x0a:    /* LF */
581          *lenptr = 1;
582          return p;
583    
584          case 0x0d:    /* CR */
585          if (p < endptr && *p == 0x0a)
586            {
587            *lenptr = 2;
588            p++;
589            }
590          else *lenptr = 1;
591          return p;
592    
593          default:
594          break;
595          }
596        }   /* End of loop for ANYCRLF case */
597    
598      *lenptr = 0;  /* Must have hit the end */
599      return endptr;
600    
601    case EL_ANY:    case EL_ANY:
602    while (p < endptr)    while (p < endptr)
603      {      {
# Line 643  switch(endlinetype) Line 696  switch(endlinetype)
696    return p;   /* But control should never get here */    return p;   /* But control should never get here */
697    
698    case EL_ANY:    case EL_ANY:
699      case EL_ANYCRLF:
700    if (*(--p) == '\n' && p > startptr && p[-1] == '\r') p--;    if (*(--p) == '\n' && p > startptr && p[-1] == '\r') p--;
701    if (utf8) while ((*p & 0xc0) == 0x80) p--;    if (utf8) while ((*p & 0xc0) == 0x80) p--;
702    
# Line 671  switch(endlinetype) Line 725  switch(endlinetype)
725        }        }
726      else c = *((unsigned char *)pp);      else c = *((unsigned char *)pp);
727    
728      switch (c)      if (endlinetype == EL_ANYCRLF) switch (c)
729          {
730          case 0x0a:    /* LF */
731          case 0x0d:    /* CR */
732          return p;
733    
734          default:
735          break;
736          }
737    
738        else switch (c)
739        {        {
740        case 0x0a:    /* LF */        case 0x0a:    /* LF */
741        case 0x0b:    /* VT */        case 0x0b:    /* VT */
# Line 764  int rc = 1; Line 828  int rc = 1;
828  int linenumber = 1;  int linenumber = 1;
829  int lastmatchnumber = 0;  int lastmatchnumber = 0;
830  int count = 0;  int count = 0;
831    int filepos = 0;
832  int offsets[99];  int offsets[99];
833  char *lastmatchrestart = NULL;  char *lastmatchrestart = NULL;
834  char buffer[3*MBUFTHIRD];  char buffer[3*MBUFTHIRD];
# Line 788  while (ptr < endptr) Line 853  while (ptr < endptr)
853    int i, endlinelength;    int i, endlinelength;
854    int mrc = 0;    int mrc = 0;
855    BOOL match = FALSE;    BOOL match = FALSE;
856      char *matchptr = ptr;
857    char *t = ptr;    char *t = ptr;
858    size_t length, linelength;    size_t length, linelength;
859    
# Line 800  while (ptr < endptr) Line 866  while (ptr < endptr)
866    
867    t = end_of_line(t, endptr, &endlinelength);    t = end_of_line(t, endptr, &endlinelength);
868    linelength = t - ptr - endlinelength;    linelength = t - ptr - endlinelength;
869    length = multiline? endptr - ptr : linelength;    length = multiline? (size_t)(endptr - ptr) : linelength;
870    
871    /* Extra processing for Jeffrey Friedl's debugging. */    /* Extra processing for Jeffrey Friedl's debugging. */
872    
# Line 850  while (ptr < endptr) Line 916  while (ptr < endptr)
916    }    }
917  #endif  #endif
918    
919      /* We come back here after a match when the -o option (only_matching) is set,
920      in order to find any further matches in the same line. */
921    
922      ONLY_MATCHING_RESTART:
923    
924    /* Run through all the patterns until one matches. Note that we don't include    /* Run through all the patterns until one matches. Note that we don't include
925    the final newline in the subject string. */    the final newline in the subject string. */
926    
927    for (i = 0; i < pattern_count; i++)    for (i = 0; i < pattern_count; i++)
928      {      {
929      mrc = pcre_exec(pattern_list[i], hints_list[i], ptr, length, 0, 0,      mrc = pcre_exec(pattern_list[i], hints_list[i], matchptr, length, 0, 0,
930        offsets, 99);        offsets, 99);
931      if (mrc >= 0) { match = TRUE; break; }      if (mrc >= 0) { match = TRUE; break; }
932      if (mrc != PCRE_ERROR_NOMATCH)      if (mrc != PCRE_ERROR_NOMATCH)
# Line 864  while (ptr < endptr) Line 934  while (ptr < endptr)
934        fprintf(stderr, "pcregrep: pcre_exec() error %d while matching ", mrc);        fprintf(stderr, "pcregrep: pcre_exec() error %d while matching ", mrc);
935        if (pattern_count > 1) fprintf(stderr, "pattern number %d to ", i+1);        if (pattern_count > 1) fprintf(stderr, "pattern number %d to ", i+1);
936        fprintf(stderr, "this line:\n");        fprintf(stderr, "this line:\n");
937        fwrite(ptr, 1, linelength, stderr);   /* In case binary zero included */        fwrite(matchptr, 1, linelength, stderr);  /* In case binary zero included */
938        fprintf(stderr, "\n");        fprintf(stderr, "\n");
939        if (error_count == 0 &&        if (error_count == 0 &&
940            (mrc == PCRE_ERROR_MATCHLIMIT || mrc == PCRE_ERROR_RECURSIONLIMIT))            (mrc == PCRE_ERROR_MATCHLIMIT || mrc == PCRE_ERROR_RECURSIONLIMIT))
# Line 911  while (ptr < endptr) Line 981  while (ptr < endptr)
981      else if (quiet) return 0;      else if (quiet) return 0;
982    
983      /* The --only-matching option prints just the substring that matched, and      /* The --only-matching option prints just the substring that matched, and
984      does not pring any context. */      the --file-offsets and --line-offsets options output offsets for the
985        matching substring (they both force --only-matching). None of these options
986        prints any context. Afterwards, adjust the start and length, and then jump
987        back to look for further matches in the same line. If we are in invert
988        mode, however, nothing is printed - this could be still useful because the
989        return code is set. */
990    
991      else if (only_matching)      else if (only_matching)
992        {        {
993        if (printname != NULL) fprintf(stdout, "%s:", printname);        if (!invert)
994        if (number) fprintf(stdout, "%d:", linenumber);          {
995        fwrite(ptr + offsets[0], 1, offsets[1] - offsets[0], stdout);          if (printname != NULL) fprintf(stdout, "%s:", printname);
996        fprintf(stdout, "\n");          if (number) fprintf(stdout, "%d:", linenumber);
997            if (line_offsets)
998              fprintf(stdout, "%d,%d", matchptr + offsets[0] - ptr,
999                offsets[1] - offsets[0]);
1000            else if (file_offsets)
1001              fprintf(stdout, "%d,%d", filepos + matchptr + offsets[0] - ptr,
1002                offsets[1] - offsets[0]);
1003            else
1004              fwrite(matchptr + offsets[0], 1, offsets[1] - offsets[0], stdout);
1005            fprintf(stdout, "\n");
1006            matchptr += offsets[1];
1007            length -= offsets[1];
1008            match = FALSE;
1009            goto ONLY_MATCHING_RESTART;
1010            }
1011        }        }
1012    
1013      /* This is the default case when none of the above options is set. We print      /* This is the default case when none of the above options is set. We print
# Line 1008  while (ptr < endptr) Line 1097  while (ptr < endptr)
1097    
1098        /* In multiline mode, we want to print to the end of the line in which        /* In multiline mode, we want to print to the end of the line in which
1099        the end of the matched string is found, so we adjust linelength and the        the end of the matched string is found, so we adjust linelength and the
1100        line number appropriately. Because the PCRE_FIRSTLINE option is set, the        line number appropriately, but only when there actually was a match
1101        start of the match will always be before the first newline sequence. */        (invert not set). Because the PCRE_FIRSTLINE option is set, the start of
1102          the match will always be before the first newline sequence. */
1103    
1104        if (multiline)        if (multiline)
1105          {          {
1106          int ellength;          int ellength;
1107          char *endmatch = ptr + offsets[1];          char *endmatch = ptr;
1108          t = ptr;          if (!invert)
         while (t < endmatch)  
1109            {            {
1110            t = end_of_line(t, endptr, &ellength);            endmatch += offsets[1];
1111            if (t <= endmatch) linenumber++; else break;            t = ptr;
1112              while (t < endmatch)
1113                {
1114                t = end_of_line(t, endptr, &ellength);
1115                if (t <= endmatch) linenumber++; else break;
1116                }
1117            }            }
1118          endmatch = end_of_line(endmatch, endptr, &ellength);          endmatch = end_of_line(endmatch, endptr, &ellength);
1119          linelength = endmatch - ptr - ellength;          linelength = endmatch - ptr - ellength;
# Line 1052  while (ptr < endptr) Line 1146  while (ptr < endptr)
1146          fprintf(stdout, "%c[%sm", 0x1b, colour_string);          fprintf(stdout, "%c[%sm", 0x1b, colour_string);
1147          fwrite(ptr + offsets[0], 1, offsets[1] - offsets[0], stdout);          fwrite(ptr + offsets[0], 1, offsets[1] - offsets[0], stdout);
1148          fprintf(stdout, "%c[00m", 0x1b);          fprintf(stdout, "%c[00m", 0x1b);
1149          fwrite(ptr + offsets[1], 1, linelength - offsets[1], stdout);          fwrite(ptr + offsets[1], 1, (linelength + endlinelength) - offsets[1],
1150              stdout);
1151          }          }
1152        else fwrite(ptr, 1, linelength + endlinelength, stdout);        else fwrite(ptr, 1, linelength + endlinelength, stdout);
1153        }        }
# Line 1068  while (ptr < endptr) Line 1163  while (ptr < endptr)
1163      lastmatchnumber = linenumber + 1;      lastmatchnumber = linenumber + 1;
1164      }      }
1165    
1166    /* Advance to after the newline and increment the line number. */    /* For a match in multiline inverted mode (which of course did not cause
1167      anything to be printed), we have to move on to the end of the match before
1168      proceeding. */
1169    
1170      if (multiline && invert && match)
1171        {
1172        int ellength;
1173        char *endmatch = ptr + offsets[1];
1174        t = ptr;
1175        while (t < endmatch)
1176          {
1177          t = end_of_line(t, endptr, &ellength);
1178          if (t <= endmatch) linenumber++; else break;
1179          }
1180        endmatch = end_of_line(endmatch, endptr, &ellength);
1181        linelength = endmatch - ptr - ellength;
1182        }
1183    
1184      /* Advance to after the newline and increment the line number. The file
1185      offset to the current line is maintained in filepos. */
1186    
1187    ptr += linelength + endlinelength;    ptr += linelength + endlinelength;
1188      filepos += linelength + endlinelength;
1189    linenumber++;    linenumber++;
1190    
1191    /* If we haven't yet reached the end of the file (the buffer is full), and    /* If we haven't yet reached the end of the file (the buffer is full), and
# Line 1257  for (op = optionlist; op->one_char != 0; Line 1372  for (op = optionlist; op->one_char != 0;
1372    if (op->one_char > 0) fprintf(stderr, "%c", op->one_char);    if (op->one_char > 0) fprintf(stderr, "%c", op->one_char);
1373    }    }
1374  fprintf(stderr, "] [long options] [pattern] [files]\n");  fprintf(stderr, "] [long options] [pattern] [files]\n");
1375  fprintf(stderr, "Type `pcregrep --help' for more information.\n");  fprintf(stderr, "Type `pcregrep --help' for more information and the long "
1376      "options.\n");
1377  return rc;  return rc;
1378  }  }
1379    
# Line 1312  handle_option(int letter, int options) Line 1428  handle_option(int letter, int options)
1428  {  {
1429  switch(letter)  switch(letter)
1430    {    {
1431      case N_FOFFSETS: file_offsets = TRUE; break;
1432    case N_HELP: help(); exit(0);    case N_HELP: help(); exit(0);
1433      case N_LOFFSETS: line_offsets = number = TRUE; break;
1434    case 'c': count_only = TRUE; break;    case 'c': count_only = TRUE; break;
1435    case 'F': process_options |= PO_FIXED_STRINGS; break;    case 'F': process_options |= PO_FIXED_STRINGS; break;
1436    case 'H': filenames = FN_FORCE; break;    case 'H': filenames = FN_FORCE; break;
# Line 1408  sprintf(buffer, "%s%.*s%s", prefix[proce Line 1526  sprintf(buffer, "%s%.*s%s", prefix[proce
1526    suffix[process_options]);    suffix[process_options]);
1527  pattern_list[pattern_count] =  pattern_list[pattern_count] =
1528    pcre_compile(buffer, options, &error, &errptr, pcretables);    pcre_compile(buffer, options, &error, &errptr, pcretables);
1529  if (pattern_list[pattern_count++] != NULL) return TRUE;  if (pattern_list[pattern_count] != NULL)
1530      {
1531      pattern_count++;
1532      return TRUE;
1533      }
1534    
1535  /* Handle compile errors */  /* Handle compile errors */
1536    
# Line 1466  if ((process_options & PO_FIXED_STRINGS) Line 1588  if ((process_options & PO_FIXED_STRINGS)
1588      char *p = end_of_line(pattern, eop, &ellength);      char *p = end_of_line(pattern, eop, &ellength);
1589      if (ellength == 0)      if (ellength == 0)
1590        return compile_single_pattern(pattern, options, filename, count);        return compile_single_pattern(pattern, options, filename, count);
1591      sprintf(buffer, "%.*s", p - pattern - ellength, pattern);      sprintf(buffer, "%.*s", (int)(p - pattern - ellength), pattern);
1592      pattern = p;      pattern = p;
1593      if (!compile_single_pattern(buffer, options, filename, count))      if (!compile_single_pattern(buffer, options, filename, count))
1594        return FALSE;        return FALSE;
# Line 1490  int i, j; Line 1612  int i, j;
1612  int rc = 1;  int rc = 1;
1613  int pcre_options = 0;  int pcre_options = 0;
1614  int cmd_pattern_count = 0;  int cmd_pattern_count = 0;
1615    int hint_count = 0;
1616  int errptr;  int errptr;
1617  BOOL only_one_at_top;  BOOL only_one_at_top;
1618  char *patterns[MAX_PATTERN_COUNT];  char *patterns[MAX_PATTERN_COUNT];
# Line 1507  switch(i) Line 1630  switch(i)
1630    case '\r':               newline = (char *)"cr"; break;    case '\r':               newline = (char *)"cr"; break;
1631    case ('\r' << 8) | '\n': newline = (char *)"crlf"; break;    case ('\r' << 8) | '\n': newline = (char *)"crlf"; break;
1632    case -1:                 newline = (char *)"any"; break;    case -1:                 newline = (char *)"any"; break;
1633      case -2:                 newline = (char *)"anycrlf"; break;
1634    }    }
1635    
1636  /* Process the options */  /* Process the options */
# Line 1564  for (i = 1; i < argc; i++) Line 1688  for (i = 1; i < argc; i++)
1688          else                 /* Special case xxx=data */          else                 /* Special case xxx=data */
1689            {            {
1690            int oplen = equals - op->long_name;            int oplen = equals - op->long_name;
1691            int arglen = (argequals == NULL)? strlen(arg) : argequals - arg;            int arglen = (argequals == NULL)? (int)strlen(arg) : argequals - arg;
1692            if (oplen == arglen && strncmp(arg, op->long_name, oplen) == 0)            if (oplen == arglen && strncmp(arg, op->long_name, oplen) == 0)
1693              {              {
1694              option_data = arg + arglen;              option_data = arg + arglen;
# Line 1583  for (i = 1; i < argc; i++) Line 1707  for (i = 1; i < argc; i++)
1707          char buff2[24];          char buff2[24];
1708          int baselen = opbra - op->long_name;          int baselen = opbra - op->long_name;
1709          sprintf(buff1, "%.*s", baselen, op->long_name);          sprintf(buff1, "%.*s", baselen, op->long_name);
1710          sprintf(buff2, "%s%.*s", buff1, strlen(op->long_name) - baselen - 2,          sprintf(buff2, "%s%.*s", buff1,
1711            opbra + 1);            (int)strlen(op->long_name) - baselen - 2, opbra + 1);
1712          if (strcmp(arg, buff1) == 0 || strcmp(arg, buff2) == 0)          if (strcmp(arg, buff1) == 0 || strcmp(arg, buff2) == 0)
1713            break;            break;
1714          }          }
# Line 1742  if (both_context > 0) Line 1866  if (both_context > 0)
1866    if (after_context == 0) after_context = both_context;    if (after_context == 0) after_context = both_context;
1867    if (before_context == 0) before_context = both_context;    if (before_context == 0) before_context = both_context;
1868    }    }
1869    
1870    /* Only one of --only-matching, --file-offsets, or --line-offsets is permitted.
1871    However, the latter two set the only_matching flag. */
1872    
1873    if ((only_matching && (file_offsets || line_offsets)) ||
1874        (file_offsets && line_offsets))
1875      {
1876      fprintf(stderr, "pcregrep: Cannot mix --only-matching, --file-offsets "
1877        "and/or --line-offsets\n");
1878      exit(usage(2));
1879      }
1880    
1881    if (file_offsets || line_offsets) only_matching = TRUE;
1882    
1883  /* If a locale has not been provided as an option, see if the LC_CTYPE or  /* If a locale has not been provided as an option, see if the LC_CTYPE or
1884  LC_ALL environment variable is set, and if so, use it. */  LC_ALL environment variable is set, and if so, use it. */
# Line 1814  else if (strcmp(newline, "any") == 0 || Line 1951  else if (strcmp(newline, "any") == 0 ||
1951    pcre_options |= PCRE_NEWLINE_ANY;    pcre_options |= PCRE_NEWLINE_ANY;
1952    endlinetype = EL_ANY;    endlinetype = EL_ANY;
1953    }    }
1954    else if (strcmp(newline, "anycrlf") == 0 || strcmp(newline, "ANYCRLF") == 0)
1955      {
1956      pcre_options |= PCRE_NEWLINE_ANYCRLF;
1957      endlinetype = EL_ANYCRLF;
1958      }
1959  else  else
1960    {    {
1961    fprintf(stderr, "pcregrep: Invalid newline specifier \"%s\"\n", newline);    fprintf(stderr, "pcregrep: Invalid newline specifier \"%s\"\n", newline);
# Line 1942  for (j = 0; j < pattern_count; j++) Line 2084  for (j = 0; j < pattern_count; j++)
2084      fprintf(stderr, "pcregrep: Error while studying regex%s: %s\n", s, error);      fprintf(stderr, "pcregrep: Error while studying regex%s: %s\n", s, error);
2085      goto EXIT2;      goto EXIT2;
2086      }      }
2087      hint_count++;
2088    }    }
2089    
2090  /* If there are include or exclude patterns, compile them. */  /* If there are include or exclude patterns, compile them. */
# Line 2001  if (pattern_list != NULL) Line 2144  if (pattern_list != NULL)
2144    }    }
2145  if (hints_list != NULL)  if (hints_list != NULL)
2146    {    {
2147    for (i = 0; i < pattern_count; i++) free(hints_list[i]);    for (i = 0; i < hint_count; i++) free(hints_list[i]);
2148    free(hints_list);    free(hints_list);
2149    }    }
2150  return rc;  return rc;

Legend:
Removed from v.137  
changed lines
  Added in v.283

webmaster@exim.org
ViewVC Help
Powered by ViewVC 1.1.12