261 |
cbit_xdigit,-1, 0 /* xdigit */ |
cbit_xdigit,-1, 0 /* xdigit */ |
262 |
}; |
}; |
263 |
|
|
264 |
/* Table of substitutes for \d etc when PCRE_UCP is set. The POSIX class |
/* Table of substitutes for \d etc when PCRE_UCP is set. The POSIX class |
265 |
substitutes must be in the order of the names, defined above, and there are |
substitutes must be in the order of the names, defined above, and there are |
266 |
both positive and negative cases. NULL means no substitute. */ |
both positive and negative cases. NULL means no substitute. */ |
267 |
|
|
268 |
#ifdef SUPPORT_UCP |
#ifdef SUPPORT_UCP |
272 |
(uschar *)"\\P{Xsp}", /* \S */ /* NOTE: Xsp is Perl space */ |
(uschar *)"\\P{Xsp}", /* \S */ /* NOTE: Xsp is Perl space */ |
273 |
(uschar *)"\\p{Xsp}", /* \s */ |
(uschar *)"\\p{Xsp}", /* \s */ |
274 |
(uschar *)"\\P{Xwd}", /* \W */ |
(uschar *)"\\P{Xwd}", /* \W */ |
275 |
(uschar *)"\\p{Xwd}" /* \w */ |
(uschar *)"\\p{Xwd}" /* \w */ |
276 |
}; |
}; |
277 |
|
|
278 |
static const uschar *posix_substitutes[] = { |
static const uschar *posix_substitutes[] = { |
279 |
(uschar *)"\\p{L}", /* alpha */ |
(uschar *)"\\p{L}", /* alpha */ |
280 |
(uschar *)"\\p{Ll}", /* lower */ |
(uschar *)"\\p{Ll}", /* lower */ |
281 |
(uschar *)"\\p{Lu}", /* upper */ |
(uschar *)"\\p{Lu}", /* upper */ |
282 |
(uschar *)"\\p{Xan}", /* alnum */ |
(uschar *)"\\p{Xan}", /* alnum */ |
283 |
NULL, /* ascii */ |
NULL, /* ascii */ |
284 |
(uschar *)"\\h", /* blank */ |
(uschar *)"\\h", /* blank */ |
285 |
NULL, /* cntrl */ |
NULL, /* cntrl */ |
289 |
NULL, /* punct */ |
NULL, /* punct */ |
290 |
(uschar *)"\\p{Xps}", /* space */ /* NOTE: Xps is POSIX space */ |
(uschar *)"\\p{Xps}", /* space */ /* NOTE: Xps is POSIX space */ |
291 |
(uschar *)"\\p{Xwd}", /* word */ |
(uschar *)"\\p{Xwd}", /* word */ |
292 |
NULL, /* xdigit */ |
NULL, /* xdigit */ |
293 |
/* Negated cases */ |
/* Negated cases */ |
294 |
(uschar *)"\\P{L}", /* ^alpha */ |
(uschar *)"\\P{L}", /* ^alpha */ |
295 |
(uschar *)"\\P{Ll}", /* ^lower */ |
(uschar *)"\\P{Ll}", /* ^lower */ |
296 |
(uschar *)"\\P{Lu}", /* ^upper */ |
(uschar *)"\\P{Lu}", /* ^upper */ |
297 |
(uschar *)"\\P{Xan}", /* ^alnum */ |
(uschar *)"\\P{Xan}", /* ^alnum */ |
298 |
NULL, /* ^ascii */ |
NULL, /* ^ascii */ |
299 |
(uschar *)"\\H", /* ^blank */ |
(uschar *)"\\H", /* ^blank */ |
300 |
NULL, /* ^cntrl */ |
NULL, /* ^cntrl */ |
304 |
NULL, /* ^punct */ |
NULL, /* ^punct */ |
305 |
(uschar *)"\\P{Xps}", /* ^space */ /* NOTE: Xps is POSIX space */ |
(uschar *)"\\P{Xps}", /* ^space */ /* NOTE: Xps is POSIX space */ |
306 |
(uschar *)"\\P{Xwd}", /* ^word */ |
(uschar *)"\\P{Xwd}", /* ^word */ |
307 |
NULL /* ^xdigit */ |
NULL /* ^xdigit */ |
308 |
}; |
}; |
309 |
#define POSIX_SUBSIZE (sizeof(posix_substitutes)/sizeof(uschar *)) |
#define POSIX_SUBSIZE (sizeof(posix_substitutes)/sizeof(uschar *)) |
310 |
#endif |
#endif |
311 |
|
|
312 |
#define STRING(a) # a |
#define STRING(a) # a |
313 |
#define XSTRING(s) STRING(s) |
#define XSTRING(s) STRING(s) |
407 |
/* 65 */ |
/* 65 */ |
408 |
"different names for subpatterns of the same number are not allowed\0" |
"different names for subpatterns of the same number are not allowed\0" |
409 |
"(*MARK) must have an argument\0" |
"(*MARK) must have an argument\0" |
410 |
"this version of PCRE is not compiled with PCRE_UCP support\0" |
"this version of PCRE is not compiled with PCRE_UCP support\0" |
411 |
; |
; |
412 |
|
|
413 |
/* Table to identify digits and hex digits. This is used when compiling |
/* Table to identify digits and hex digits. This is used when compiling |
2407 |
ptype the property type |
ptype the property type |
2408 |
pdata the data for the type |
pdata the data for the type |
2409 |
negated TRUE if it's a negated property (\P or \p{^) |
negated TRUE if it's a negated property (\P or \p{^) |
2410 |
|
|
2411 |
Returns: TRUE if auto-possessifying is OK |
Returns: TRUE if auto-possessifying is OK |
2412 |
*/ |
*/ |
2413 |
|
|
2414 |
static BOOL |
static BOOL |
2415 |
check_char_prop(int c, int ptype, int pdata, BOOL negated) |
check_char_prop(int c, int ptype, int pdata, BOOL negated) |
2453 |
_pcre_ucp_gentype[prop->chartype] == ucp_N || |
_pcre_ucp_gentype[prop->chartype] == ucp_N || |
2454 |
c == CHAR_UNDERSCORE) == negated; |
c == CHAR_UNDERSCORE) == negated; |
2455 |
} |
} |
2456 |
return FALSE; |
return FALSE; |
2457 |
} |
} |
2458 |
#endif /* SUPPORT_UCP */ |
#endif /* SUPPORT_UCP */ |
2459 |
|
|
2478 |
*/ |
*/ |
2479 |
|
|
2480 |
static BOOL |
static BOOL |
2481 |
check_auto_possessive(const uschar *previous, BOOL utf8, const uschar *ptr, |
check_auto_possessive(const uschar *previous, BOOL utf8, const uschar *ptr, |
2482 |
int options, compile_data *cd) |
int options, compile_data *cd) |
2483 |
{ |
{ |
2484 |
int c, next; |
int c, next; |
2549 |
if (next >= 0) switch(op_code) |
if (next >= 0) switch(op_code) |
2550 |
{ |
{ |
2551 |
case OP_CHAR: |
case OP_CHAR: |
2552 |
#ifdef SUPPORT_UTF8 |
#ifdef SUPPORT_UTF8 |
2553 |
GETCHARTEST(c, previous); |
GETCHARTEST(c, previous); |
2554 |
#else |
#else |
2555 |
c = *previous; |
c = *previous; |
2556 |
#endif |
#endif |
2557 |
return c != next; |
return c != next; |
2558 |
|
|
2559 |
/* For CHARNC (caseless character) we must check the other case. If we have |
/* For CHARNC (caseless character) we must check the other case. If we have |
2560 |
Unicode property support, we can use it to test the other case of |
Unicode property support, we can use it to test the other case of |
2561 |
high-valued characters. */ |
high-valued characters. */ |
2562 |
|
|
2563 |
case OP_CHARNC: |
case OP_CHARNC: |
2564 |
#ifdef SUPPORT_UTF8 |
#ifdef SUPPORT_UTF8 |
2565 |
GETCHARTEST(c, previous); |
GETCHARTEST(c, previous); |
2566 |
#else |
#else |
2567 |
c = *previous; |
c = *previous; |
2568 |
#endif |
#endif |
2569 |
if (c == next) return FALSE; |
if (c == next) return FALSE; |
2570 |
#ifdef SUPPORT_UTF8 |
#ifdef SUPPORT_UTF8 |
2571 |
if (utf8) |
if (utf8) |
2603 |
else |
else |
2604 |
#endif /* SUPPORT_UTF8 */ |
#endif /* SUPPORT_UTF8 */ |
2605 |
return (c == cd->fcc[next]); /* Non-UTF-8 mode */ |
return (c == cd->fcc[next]); /* Non-UTF-8 mode */ |
2606 |
|
|
2607 |
/* Note that OP_DIGIT etc. are generated only when PCRE_UCP is *not* set. |
/* Note that OP_DIGIT etc. are generated only when PCRE_UCP is *not* set. |
2608 |
When it is set, \d etc. are converted into OP_(NOT_)PROP codes. */ |
When it is set, \d etc. are converted into OP_(NOT_)PROP codes. */ |
2609 |
|
|
2610 |
case OP_DIGIT: |
case OP_DIGIT: |
2611 |
return next > 127 || (cd->ctypes[next] & ctype_digit) == 0; |
return next > 127 || (cd->ctypes[next] & ctype_digit) == 0; |
2673 |
#ifdef SUPPORT_UCP |
#ifdef SUPPORT_UCP |
2674 |
case OP_PROP: |
case OP_PROP: |
2675 |
return check_char_prop(next, previous[0], previous[1], FALSE); |
return check_char_prop(next, previous[0], previous[1], FALSE); |
2676 |
|
|
2677 |
case OP_NOTPROP: |
case OP_NOTPROP: |
2678 |
return check_char_prop(next, previous[0], previous[1], TRUE); |
return check_char_prop(next, previous[0], previous[1], TRUE); |
2679 |
#endif |
#endif |
2683 |
} |
} |
2684 |
|
|
2685 |
|
|
2686 |
/* Handle the case when the next item is \d, \s, etc. Note that when PCRE_UCP |
/* Handle the case when the next item is \d, \s, etc. Note that when PCRE_UCP |
2687 |
is set, \d turns into ESC_du rather than ESC_d, etc., so ESC_d etc. are |
is set, \d turns into ESC_du rather than ESC_d, etc., so ESC_d etc. are |
2688 |
generated only when PCRE_UCP is *not* set, that is, when only ASCII |
generated only when PCRE_UCP is *not* set, that is, when only ASCII |
2689 |
characteristics are recognized. Similarly, the opcodes OP_DIGIT etc. are |
characteristics are recognized. Similarly, the opcodes OP_DIGIT etc. are |
2690 |
replaced by OP_PROP codes when PCRE_UCP is set. */ |
replaced by OP_PROP codes when PCRE_UCP is set. */ |
2691 |
|
|
2692 |
switch(op_code) |
switch(op_code) |
2693 |
{ |
{ |
2694 |
case OP_CHAR: |
case OP_CHAR: |
2695 |
case OP_CHARNC: |
case OP_CHARNC: |
2696 |
#ifdef SUPPORT_UTF8 |
#ifdef SUPPORT_UTF8 |
2697 |
GETCHARTEST(c, previous); |
GETCHARTEST(c, previous); |
2698 |
#else |
#else |
2699 |
c = *previous; |
c = *previous; |
2700 |
#endif |
#endif |
2701 |
switch(-next) |
switch(-next) |
2702 |
{ |
{ |
2703 |
case ESC_d: |
case ESC_d: |
2761 |
default: |
default: |
2762 |
return -next == ESC_v; |
return -next == ESC_v; |
2763 |
} |
} |
2764 |
|
|
2765 |
/* When PCRE_UCP is set, these values get generated for \d etc. Find |
/* When PCRE_UCP is set, these values get generated for \d etc. Find |
2766 |
their substitutions and process them. The result will always be either |
their substitutions and process them. The result will always be either |
2767 |
-ESC_p or -ESC_P. Then fall through to process those values. */ |
-ESC_p or -ESC_P. Then fall through to process those values. */ |
2768 |
|
|
2769 |
#ifdef SUPPORT_UCP |
#ifdef SUPPORT_UCP |
2770 |
case ESC_du: |
case ESC_du: |
2771 |
case ESC_DU: |
case ESC_DU: |
2780 |
if (temperrorcode != 0) return FALSE; |
if (temperrorcode != 0) return FALSE; |
2781 |
ptr++; /* For compatibility */ |
ptr++; /* For compatibility */ |
2782 |
} |
} |
2783 |
/* Fall through */ |
/* Fall through */ |
2784 |
|
|
2785 |
case ESC_p: |
case ESC_p: |
2786 |
case ESC_P: |
case ESC_P: |
2787 |
{ |
{ |
2788 |
int ptype, pdata, errorcodeptr; |
int ptype, pdata, errorcodeptr; |
2789 |
BOOL negated; |
BOOL negated; |
2790 |
|
|
2791 |
ptr--; /* Make ptr point at the p or P */ |
ptr--; /* Make ptr point at the p or P */ |
2792 |
ptype = get_ucp(&ptr, &negated, &pdata, &errorcodeptr); |
ptype = get_ucp(&ptr, &negated, &pdata, &errorcodeptr); |
2793 |
if (ptype < 0) return FALSE; |
if (ptype < 0) return FALSE; |
2794 |
ptr++; /* Point past the final curly ket */ |
ptr++; /* Point past the final curly ket */ |
2795 |
|
|
2796 |
/* If the property item is optional, we have to give up. (When generated |
/* If the property item is optional, we have to give up. (When generated |
2797 |
from \d etc by PCRE_UCP, this test will have been applied much earlier, |
from \d etc by PCRE_UCP, this test will have been applied much earlier, |
2798 |
to the original \d etc. At this point, ptr will point to a zero byte. */ |
to the original \d etc. At this point, ptr will point to a zero byte. */ |
2799 |
|
|
2800 |
if (*ptr == CHAR_ASTERISK || *ptr == CHAR_QUESTION_MARK || |
if (*ptr == CHAR_ASTERISK || *ptr == CHAR_QUESTION_MARK || |
2801 |
strncmp((char *)ptr, STR_LEFT_CURLY_BRACKET STR_0 STR_COMMA, 3) == 0) |
strncmp((char *)ptr, STR_LEFT_CURLY_BRACKET STR_0 STR_COMMA, 3) == 0) |
2802 |
return FALSE; |
return FALSE; |
2803 |
|
|
2804 |
/* Do the property check. */ |
/* Do the property check. */ |
2805 |
|
|
2806 |
return check_char_prop(c, ptype, pdata, (next == -ESC_P) != negated); |
return check_char_prop(c, ptype, pdata, (next == -ESC_P) != negated); |
2807 |
} |
} |
2808 |
#endif |
#endif |
2809 |
|
|
2810 |
default: |
default: |
2811 |
return FALSE; |
return FALSE; |
2812 |
} |
} |
2813 |
|
|
2814 |
/* In principle, support for Unicode properties should be integrated here as |
/* In principle, support for Unicode properties should be integrated here as |
2815 |
well. It means re-organizing the above code so as to get hold of the property |
well. It means re-organizing the above code so as to get hold of the property |
2816 |
values before switching on the op-code. However, I wonder how many patterns |
values before switching on the op-code. However, I wonder how many patterns |
2817 |
combine ASCII \d etc with Unicode properties? (Note that if PCRE_UCP is set, |
combine ASCII \d etc with Unicode properties? (Note that if PCRE_UCP is set, |
2818 |
these op-codes are never generated.) */ |
these op-codes are never generated.) */ |
2819 |
|
|
2820 |
case OP_DIGIT: |
case OP_DIGIT: |
2821 |
return next == -ESC_D || next == -ESC_s || next == -ESC_W || |
return next == -ESC_D || next == -ESC_s || next == -ESC_W || |
2831 |
return next == -ESC_s || next == -ESC_h || next == -ESC_v; |
return next == -ESC_s || next == -ESC_h || next == -ESC_v; |
2832 |
|
|
2833 |
case OP_HSPACE: |
case OP_HSPACE: |
2834 |
return next == -ESC_S || next == -ESC_H || next == -ESC_d || |
return next == -ESC_S || next == -ESC_H || next == -ESC_d || |
2835 |
next == -ESC_w || next == -ESC_v || next == -ESC_R; |
next == -ESC_w || next == -ESC_v || next == -ESC_R; |
2836 |
|
|
2837 |
case OP_NOT_HSPACE: |
case OP_NOT_HSPACE: |
2838 |
return next == -ESC_h; |
return next == -ESC_h; |
2839 |
|
|
2840 |
/* Can't have \S in here because VT matches \S (Perl anomaly) */ |
/* Can't have \S in here because VT matches \S (Perl anomaly) */ |
2841 |
case OP_ANYNL: |
case OP_ANYNL: |
2842 |
case OP_VSPACE: |
case OP_VSPACE: |
2843 |
return next == -ESC_V || next == -ESC_d || next == -ESC_w; |
return next == -ESC_V || next == -ESC_d || next == -ESC_w; |
2844 |
|
|
2846 |
return next == -ESC_v || next == -ESC_R; |
return next == -ESC_v || next == -ESC_R; |
2847 |
|
|
2848 |
case OP_WORDCHAR: |
case OP_WORDCHAR: |
2849 |
return next == -ESC_W || next == -ESC_s || next == -ESC_h || |
return next == -ESC_W || next == -ESC_s || next == -ESC_h || |
2850 |
next == -ESC_v || next == -ESC_R; |
next == -ESC_v || next == -ESC_R; |
2851 |
|
|
2852 |
case OP_NOT_WORDCHAR: |
case OP_NOT_WORDCHAR: |
2982 |
|
|
2983 |
c = *ptr; |
c = *ptr; |
2984 |
|
|
2985 |
/* If we are at the end of a nested substitution, revert to the outer level |
/* If we are at the end of a nested substitution, revert to the outer level |
2986 |
string. Nesting only happens one level deep. */ |
string. Nesting only happens one level deep. */ |
2987 |
|
|
2988 |
if (c == 0 && nestptr != NULL) |
if (c == 0 && nestptr != NULL) |
3289 |
{ /* Braces are required because the */ |
{ /* Braces are required because the */ |
3290 |
GETCHARLEN(c, ptr, ptr); /* macro generates multiple statements */ |
GETCHARLEN(c, ptr, ptr); /* macro generates multiple statements */ |
3291 |
} |
} |
3292 |
|
|
3293 |
/* In the pre-compile phase, accumulate the length of any UTF-8 extra |
/* In the pre-compile phase, accumulate the length of any UTF-8 extra |
3294 |
data and reset the pointer. This is so that very large classes that |
data and reset the pointer. This is so that very large classes that |
3295 |
contain a zillion UTF-8 characters no longer overwrite the work space |
contain a zillion UTF-8 characters no longer overwrite the work space |
3358 |
|
|
3359 |
if ((options & PCRE_CASELESS) != 0 && posix_class <= 2) |
if ((options & PCRE_CASELESS) != 0 && posix_class <= 2) |
3360 |
posix_class = 0; |
posix_class = 0; |
3361 |
|
|
3362 |
/* When PCRE_UCP is set, some of the POSIX classes are converted to |
/* When PCRE_UCP is set, some of the POSIX classes are converted to |
3363 |
different escape sequences that use Unicode properties. */ |
different escape sequences that use Unicode properties. */ |
3364 |
|
|
3365 |
#ifdef SUPPORT_UCP |
#ifdef SUPPORT_UCP |
3366 |
if ((options & PCRE_UCP) != 0) |
if ((options & PCRE_UCP) != 0) |
3367 |
{ |
{ |
3368 |
int pc = posix_class + ((local_negate)? POSIX_SUBSIZE/2 : 0); |
int pc = posix_class + ((local_negate)? POSIX_SUBSIZE/2 : 0); |
3369 |
if (posix_substitutes[pc] != NULL) |
if (posix_substitutes[pc] != NULL) |
3370 |
{ |
{ |
3371 |
nestptr = tempptr + 1; |
nestptr = tempptr + 1; |
3372 |
ptr = posix_substitutes[pc] - 1; |
ptr = posix_substitutes[pc] - 1; |
3373 |
continue; |
continue; |
3374 |
} |
} |
3375 |
} |
} |
3376 |
#endif |
#endif |
3377 |
/* In the non-UCP case, we build the bit map for the POSIX class in a |
/* In the non-UCP case, we build the bit map for the POSIX class in a |
3378 |
chunk of local store because we may be adding and subtracting from it, |
chunk of local store because we may be adding and subtracting from it, |
3379 |
and we don't want to subtract bits that may be in the main map already. |
and we don't want to subtract bits that may be in the main map already. |
3460 |
case ESC_SU: |
case ESC_SU: |
3461 |
nestptr = ptr; |
nestptr = ptr; |
3462 |
ptr = substitutes[-c - ESC_DU] - 1; /* Just before substitute */ |
ptr = substitutes[-c - ESC_DU] - 1; /* Just before substitute */ |
3463 |
class_charcount -= 2; /* Undo! */ |
class_charcount -= 2; /* Undo! */ |
3464 |
continue; |
continue; |
3465 |
#endif |
#endif |
3466 |
case ESC_d: |
case ESC_d: |
3911 |
can cause firstbyte to be set. Otherwise, there can be no first char if |
can cause firstbyte to be set. Otherwise, there can be no first char if |
3912 |
this item is first, whatever repeat count may follow. In the case of |
this item is first, whatever repeat count may follow. In the case of |
3913 |
reqbyte, save the previous value for reinstating. */ |
reqbyte, save the previous value for reinstating. */ |
3914 |
|
|
3915 |
#ifdef SUPPORT_UTF8 |
#ifdef SUPPORT_UTF8 |
3916 |
if (class_charcount == 1 && !class_utf8 && |
if (class_charcount == 1 && !class_utf8 && |
3917 |
(!utf8 || !negate_class || class_lastchar < 128)) |
(!utf8 || !negate_class || class_lastchar < 128)) |
3991 |
} |
} |
3992 |
#endif |
#endif |
3993 |
|
|
3994 |
/* If there are no characters > 255, or they are all to be included or |
/* If there are no characters > 255, or they are all to be included or |
3995 |
excluded, set the opcode to OP_CLASS or OP_NCLASS, depending on whether the |
excluded, set the opcode to OP_CLASS or OP_NCLASS, depending on whether the |
3996 |
whole class was negated and whether there were negative specials such as \S |
whole class was negated and whether there were negative specials such as \S |
3997 |
(non-UCP) in the class. Then copy the 32-byte map into the code vector, |
(non-UCP) in the class. Then copy the 32-byte map into the code vector, |
5795 |
|
|
5796 |
/* ===================================================================*/ |
/* ===================================================================*/ |
5797 |
/* Handle metasequences introduced by \. For ones like \d, the ESC_ values |
/* Handle metasequences introduced by \. For ones like \d, the ESC_ values |
5798 |
are arranged to be the negation of the corresponding OP_values in the |
are arranged to be the negation of the corresponding OP_values in the |
5799 |
default case when PCRE_UCP is not set. For the back references, the values |
default case when PCRE_UCP is not set. For the back references, the values |
5800 |
are ESC_REF plus the reference number. Only back references and those types |
are ESC_REF plus the reference number. Only back references and those types |
5801 |
that consume a character may be repeated. We can test for values between |
that consume a character may be repeated. We can test for values between |
5973 |
ptr = substitutes[-c - ESC_DU] - 1; /* Just before substitute */ |
ptr = substitutes[-c - ESC_DU] - 1; /* Just before substitute */ |
5974 |
} |
} |
5975 |
else |
else |
5976 |
#endif |
#endif |
5977 |
{ |
{ |
5978 |
previous = (-c > ESC_b && -c < ESC_Z)? code : NULL; |
previous = (-c > ESC_b && -c < ESC_Z)? code : NULL; |
5979 |
*code++ = -c; |
*code++ = -c; |
5980 |
} |
} |
5981 |
} |
} |
5982 |
continue; |
continue; |
5983 |
} |
} |
6809 |
options = (options & ~(PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) | newbsr; |
options = (options & ~(PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) | newbsr; |
6810 |
else break; |
else break; |
6811 |
} |
} |
6812 |
|
|
6813 |
utf8 = (options & PCRE_UTF8) != 0; |
utf8 = (options & PCRE_UTF8) != 0; |
6814 |
|
|
6815 |
/* Can't support UTF8 unless PCRE has been compiled to include the code. */ |
/* Can't support UTF8 unless PCRE has been compiled to include the code. */ |
6835 |
if ((options & PCRE_UCP) != 0) |
if ((options & PCRE_UCP) != 0) |
6836 |
{ |
{ |
6837 |
errorcode = ERR67; |
errorcode = ERR67; |
6838 |
goto PCRE_EARLY_ERROR_RETURN; |
goto PCRE_EARLY_ERROR_RETURN; |
6839 |
} |
} |
6840 |
#endif |
#endif |
6841 |
|
|
6842 |
/* Check validity of \R options. */ |
/* Check validity of \R options. */ |