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 |
|
|