| 839 |
|
|
| 840 |
/* Now see what the actual condition is */ |
/* Now see what the actual condition is */ |
| 841 |
|
|
| 842 |
if (condcode == OP_RREF) /* Recursion test */ |
if (condcode == OP_RREF || condcode == OP_NRREF) /* Recursion test */ |
| 843 |
{ |
{ |
| 844 |
offset = GET2(ecode, LINK_SIZE + 2); /* Recursion group number*/ |
if (md->recursive == NULL) /* Not recursing => FALSE */ |
| 845 |
condition = md->recursive != NULL && |
{ |
| 846 |
(offset == RREF_ANY || offset == md->recursive->group_num); |
condition = FALSE; |
| 847 |
ecode += condition? 3 : GET(ecode, 1); |
ecode += GET(ecode, 1); |
| 848 |
} |
} |
| 849 |
|
else |
| 850 |
|
{ |
| 851 |
|
int recno = GET2(ecode, LINK_SIZE + 2); /* Recursion group number*/ |
| 852 |
|
condition = (recno == RREF_ANY || recno == md->recursive->group_num); |
| 853 |
|
|
| 854 |
|
/* If the test is for recursion into a specific subpattern, and it is |
| 855 |
|
false, but the test was set up by name, scan the table to see if the |
| 856 |
|
name refers to any other numbers, and test them. The condition is true |
| 857 |
|
if any one is set. */ |
| 858 |
|
|
| 859 |
|
if (!condition && condcode == OP_NRREF && recno != RREF_ANY) |
| 860 |
|
{ |
| 861 |
|
uschar *slotA = md->name_table; |
| 862 |
|
for (i = 0; i < md->name_count; i++) |
| 863 |
|
{ |
| 864 |
|
if (GET2(slotA, 0) == recno) break; |
| 865 |
|
slotA += md->name_entry_size; |
| 866 |
|
} |
| 867 |
|
|
| 868 |
|
/* Found a name for the number - there can be only one; duplicate |
| 869 |
|
names for different numbers are allowed, but not vice versa. First |
| 870 |
|
scan down for duplicates. */ |
| 871 |
|
|
| 872 |
|
if (i < md->name_count) |
| 873 |
|
{ |
| 874 |
|
uschar *slotB = slotA; |
| 875 |
|
while (slotB > md->name_table) |
| 876 |
|
{ |
| 877 |
|
slotB -= md->name_entry_size; |
| 878 |
|
if (strcmp((char *)slotA + 2, (char *)slotB + 2) == 0) |
| 879 |
|
{ |
| 880 |
|
condition = GET2(slotB, 0) == md->recursive->group_num; |
| 881 |
|
if (condition) break; |
| 882 |
|
} |
| 883 |
|
else break; |
| 884 |
|
} |
| 885 |
|
|
| 886 |
|
/* Scan up for duplicates */ |
| 887 |
|
|
| 888 |
|
if (!condition) |
| 889 |
|
{ |
| 890 |
|
slotB = slotA; |
| 891 |
|
for (i++; i < md->name_count; i++) |
| 892 |
|
{ |
| 893 |
|
slotB += md->name_entry_size; |
| 894 |
|
if (strcmp((char *)slotA + 2, (char *)slotB + 2) == 0) |
| 895 |
|
{ |
| 896 |
|
condition = GET2(slotB, 0) == md->recursive->group_num; |
| 897 |
|
if (condition) break; |
| 898 |
|
} |
| 899 |
|
else break; |
| 900 |
|
} |
| 901 |
|
} |
| 902 |
|
} |
| 903 |
|
} |
| 904 |
|
|
| 905 |
|
/* Chose branch according to the condition */ |
| 906 |
|
|
| 907 |
|
ecode += condition? 3 : GET(ecode, 1); |
| 908 |
|
} |
| 909 |
|
} |
| 910 |
|
|
| 911 |
else if (condcode == OP_CREF) /* Group used test */ |
else if (condcode == OP_CREF || condcode == OP_NCREF) /* Group used test */ |
| 912 |
{ |
{ |
| 913 |
offset = GET2(ecode, LINK_SIZE+2) << 1; /* Doubled ref number */ |
offset = GET2(ecode, LINK_SIZE+2) << 1; /* Doubled ref number */ |
| 914 |
condition = offset < offset_top && md->offset_vector[offset] >= 0; |
condition = offset < offset_top && md->offset_vector[offset] >= 0; |
| 915 |
|
|
| 916 |
|
/* If the numbered capture is unset, but the reference was by name, |
| 917 |
|
scan the table to see if the name refers to any other numbers, and test |
| 918 |
|
them. The condition is true if any one is set. This is tediously similar |
| 919 |
|
to the code above, but not close enough to try to amalgamate. */ |
| 920 |
|
|
| 921 |
|
if (!condition && condcode == OP_NCREF) |
| 922 |
|
{ |
| 923 |
|
int refno = offset >> 1; |
| 924 |
|
uschar *slotA = md->name_table; |
| 925 |
|
|
| 926 |
|
for (i = 0; i < md->name_count; i++) |
| 927 |
|
{ |
| 928 |
|
if (GET2(slotA, 0) == refno) break; |
| 929 |
|
slotA += md->name_entry_size; |
| 930 |
|
} |
| 931 |
|
|
| 932 |
|
/* Found a name for the number - there can be only one; duplicate names |
| 933 |
|
for different numbers are allowed, but not vice versa. First scan down |
| 934 |
|
for duplicates. */ |
| 935 |
|
|
| 936 |
|
if (i < md->name_count) |
| 937 |
|
{ |
| 938 |
|
uschar *slotB = slotA; |
| 939 |
|
while (slotB > md->name_table) |
| 940 |
|
{ |
| 941 |
|
slotB -= md->name_entry_size; |
| 942 |
|
if (strcmp((char *)slotA + 2, (char *)slotB + 2) == 0) |
| 943 |
|
{ |
| 944 |
|
offset = GET2(slotB, 0) << 1; |
| 945 |
|
condition = offset < offset_top && |
| 946 |
|
md->offset_vector[offset] >= 0; |
| 947 |
|
if (condition) break; |
| 948 |
|
} |
| 949 |
|
else break; |
| 950 |
|
} |
| 951 |
|
|
| 952 |
|
/* Scan up for duplicates */ |
| 953 |
|
|
| 954 |
|
if (!condition) |
| 955 |
|
{ |
| 956 |
|
slotB = slotA; |
| 957 |
|
for (i++; i < md->name_count; i++) |
| 958 |
|
{ |
| 959 |
|
slotB += md->name_entry_size; |
| 960 |
|
if (strcmp((char *)slotA + 2, (char *)slotB + 2) == 0) |
| 961 |
|
{ |
| 962 |
|
offset = GET2(slotB, 0) << 1; |
| 963 |
|
condition = offset < offset_top && |
| 964 |
|
md->offset_vector[offset] >= 0; |
| 965 |
|
if (condition) break; |
| 966 |
|
} |
| 967 |
|
else break; |
| 968 |
|
} |
| 969 |
|
} |
| 970 |
|
} |
| 971 |
|
} |
| 972 |
|
|
| 973 |
|
/* Chose branch according to the condition */ |
| 974 |
|
|
| 975 |
ecode += condition? 3 : GET(ecode, 1); |
ecode += condition? 3 : GET(ecode, 1); |
| 976 |
} |
} |
| 977 |
|
|
| 5010 |
(offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL; |
(offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL; |
| 5011 |
if (offsetcount < 0) return PCRE_ERROR_BADCOUNT; |
if (offsetcount < 0) return PCRE_ERROR_BADCOUNT; |
| 5012 |
|
|
| 5013 |
|
/* This information is for finding all the numbers associated with a given |
| 5014 |
|
name, for condition testing. */ |
| 5015 |
|
|
| 5016 |
|
md->name_table = (uschar *)re + re->name_table_offset; |
| 5017 |
|
md->name_count = re->name_count; |
| 5018 |
|
md->name_entry_size = re->name_entry_size; |
| 5019 |
|
|
| 5020 |
/* Fish out the optional data from the extra_data structure, first setting |
/* Fish out the optional data from the extra_data structure, first setting |
| 5021 |
the default values. */ |
the default values. */ |
| 5022 |
|
|