| 385 |
|
|
| 386 |
delimiter = *p++; |
delimiter = *p++; |
| 387 |
|
|
| 388 |
if (isalnum(delimiter)) |
if (isalnum(delimiter) || delimiter == '\\') |
| 389 |
{ |
{ |
| 390 |
fprintf(outfile, "** Delimiter must not be alphameric\n"); |
fprintf(outfile, "** Delimiter must not be alphameric or \\\n"); |
| 391 |
goto SKIP_DATA; |
goto SKIP_DATA; |
| 392 |
} |
} |
| 393 |
|
|
| 395 |
|
|
| 396 |
for(;;) |
for(;;) |
| 397 |
{ |
{ |
| 398 |
while (*pp != 0 && *pp != delimiter) pp++; |
while (*pp != 0) |
| 399 |
|
{ |
| 400 |
|
if (*pp == '\\' && pp[1] != 0) pp++; |
| 401 |
|
else if (*pp == delimiter) break; |
| 402 |
|
pp++; |
| 403 |
|
} |
| 404 |
if (*pp != 0) break; |
if (*pp != 0) break; |
| 405 |
|
|
| 406 |
len = sizeof(buffer) - (pp - buffer); |
len = sizeof(buffer) - (pp - buffer); |
| 420 |
if (infile != stdin) fprintf(outfile, "%s", (char *)pp); |
if (infile != stdin) fprintf(outfile, "%s", (char *)pp); |
| 421 |
} |
} |
| 422 |
|
|
| 423 |
|
/* If the first character after the delimiter is backslash, make |
| 424 |
|
the pattern end with backslash. This is purely to provide a way |
| 425 |
|
of testing for the error message when a pattern ends with backslash. */ |
| 426 |
|
|
| 427 |
|
if (pp[1] == '\\') *pp++ = '\\'; |
| 428 |
|
|
| 429 |
/* Terminate the pattern at the delimiter */ |
/* Terminate the pattern at the delimiter */ |
| 430 |
|
|
| 431 |
*pp++ = 0; |
*pp++ = 0; |
| 655 |
{ |
{ |
| 656 |
unsigned char *q; |
unsigned char *q; |
| 657 |
int count, c; |
int count, c; |
| 658 |
|
int copystrings = 0; |
| 659 |
|
int getstrings = 0; |
| 660 |
|
int getlist = 0; |
| 661 |
int offsets[45]; |
int offsets[45]; |
| 662 |
int size_offsets = sizeof(offsets)/sizeof(int); |
int size_offsets = sizeof(offsets)/sizeof(int); |
| 663 |
|
|
| 723 |
options |= PCRE_NOTBOL; |
options |= PCRE_NOTBOL; |
| 724 |
continue; |
continue; |
| 725 |
|
|
| 726 |
|
case 'C': |
| 727 |
|
while(isdigit(*p)) n = n * 10 + *p++ - '0'; |
| 728 |
|
copystrings |= 1 << n; |
| 729 |
|
continue; |
| 730 |
|
|
| 731 |
|
case 'G': |
| 732 |
|
while(isdigit(*p)) n = n * 10 + *p++ - '0'; |
| 733 |
|
getstrings |= 1 << n; |
| 734 |
|
continue; |
| 735 |
|
|
| 736 |
|
case 'L': |
| 737 |
|
getlist = 1; |
| 738 |
|
continue; |
| 739 |
|
|
| 740 |
case 'O': |
case 'O': |
| 741 |
while(isdigit(*p)) n = n * 10 + *p++ - '0'; |
while(isdigit(*p)) n = n * 10 + *p++ - '0'; |
| 742 |
if (n <= (int)(sizeof(offsets)/sizeof(int))) size_offsets = n; |
if (n <= (int)(sizeof(offsets)/sizeof(int))) size_offsets = n; |
| 816 |
if (count >= 0) |
if (count >= 0) |
| 817 |
{ |
{ |
| 818 |
int i; |
int i; |
| 819 |
count *= 2; |
for (i = 0; i < count * 2; i += 2) |
|
for (i = 0; i < count; i += 2) |
|
| 820 |
{ |
{ |
| 821 |
if (offsets[i] < 0) |
if (offsets[i] < 0) |
| 822 |
fprintf(outfile, "%2d: <unset>\n", i/2); |
fprintf(outfile, "%2d: <unset>\n", i/2); |
| 827 |
fprintf(outfile, "\n"); |
fprintf(outfile, "\n"); |
| 828 |
} |
} |
| 829 |
} |
} |
| 830 |
|
|
| 831 |
|
for (i = 0; i < 32; i++) |
| 832 |
|
{ |
| 833 |
|
if ((copystrings & (1 << i)) != 0) |
| 834 |
|
{ |
| 835 |
|
char buffer[16]; |
| 836 |
|
int rc = pcre_copy_substring((char *)dbuffer, offsets, count, |
| 837 |
|
i, buffer, sizeof(buffer)); |
| 838 |
|
if (rc < 0) |
| 839 |
|
fprintf(outfile, "copy substring %d failed %d\n", i, rc); |
| 840 |
|
else |
| 841 |
|
fprintf(outfile, "%2dC %s (%d)\n", i, buffer, rc); |
| 842 |
|
} |
| 843 |
|
} |
| 844 |
|
|
| 845 |
|
for (i = 0; i < 32; i++) |
| 846 |
|
{ |
| 847 |
|
if ((getstrings & (1 << i)) != 0) |
| 848 |
|
{ |
| 849 |
|
const char *substring; |
| 850 |
|
int rc = pcre_get_substring((char *)dbuffer, offsets, count, |
| 851 |
|
i, &substring); |
| 852 |
|
if (rc < 0) |
| 853 |
|
fprintf(outfile, "get substring %d failed %d\n", i, rc); |
| 854 |
|
else |
| 855 |
|
{ |
| 856 |
|
fprintf(outfile, "%2dG %s (%d)\n", i, substring, rc); |
| 857 |
|
free((void *)substring); |
| 858 |
|
} |
| 859 |
|
} |
| 860 |
|
} |
| 861 |
|
|
| 862 |
|
if (getlist) |
| 863 |
|
{ |
| 864 |
|
const char **stringlist; |
| 865 |
|
int rc = pcre_get_substring_list((char *)dbuffer, offsets, count, |
| 866 |
|
&stringlist); |
| 867 |
|
if (rc < 0) |
| 868 |
|
fprintf(outfile, "get substring list failed %d\n", rc); |
| 869 |
|
else |
| 870 |
|
{ |
| 871 |
|
for (i = 0; i < count; i++) |
| 872 |
|
fprintf(outfile, "%2dL %s\n", i, stringlist[i]); |
| 873 |
|
if (stringlist[i] != NULL) |
| 874 |
|
fprintf(outfile, "string list not terminated by NULL\n"); |
| 875 |
|
free((void *)stringlist); |
| 876 |
|
} |
| 877 |
|
} |
| 878 |
|
|
| 879 |
} |
} |
| 880 |
else |
else |
| 881 |
{ |
{ |