1N/A * Copyright (c) 1996 Malcolm Beattie 1N/A * You may distribute under the terms of either the GNU General Public 1N/A * License or the Artistic License, as specified in the README file. 1N/A * Character translations (tr///) are usually a PVOP, keeping a 1N/A * pointer to a table of shorts used to look up translations. 1N/A * Under utf8, however, a simple table isn't practical; instead, 1N/A * the OP is an SVOP, and the SV is a reference to a swash 1N/A * (i.e., an RV pointing to an HV). 1N/A * UNI(OP_foo) in toke.c returns token UNI or FUNC1 depending on 1N/A * whether parens were seen. perly.y uses OPf_SPECIAL to 1N/A * signal whether a BASEOP had empty parens or none. 1N/A * Some other UNOPs are created later, though, so the best 1N/A * test is OPf_KIDS, which is set in newUNOP. 1N/A * The file stat OPs are created via UNI(OP_foo) in toke.c but use 1N/A * the OPf_REF flag to distinguish between OP types instead of the 1N/A * usual OPf_SPECIAL flag. As usual, if OPf_KIDS is set, then we 1N/A * return OPc_UNOP so that walkoptree can find our children. If 1N/A * OPf_KIDS is not set then we check OPf_REF. Without OPf_REF set 1N/A * (no argument to the operator) it's an OP; with OPf_REF set it's 1N/A * an SVOP (and op_sv is the GV for the filehandle argument). 1N/A * next, last, redo, dump and goto use OPf_SPECIAL to indicate that a 1N/A * label was omitted (in which case it's a BASEOP) or else a term was 1N/A * seen. In this last case, all except goto are definitely PVOP but 1N/A * goto is either a PVOP (with an ordinary constant label), an UNOP 1N/A * with OPf_STACKED (with a non-constant non-sub) or an UNOP for 1N/A * OP_REFGEN (with goto &sub) in which case OPf_STACKED also seems to 1N/A warn(
"can't determine class of operator %s, assuming BASEOP\n",
1N/A char escbuff[
5];
/* to fit backslash, 3 octals + trailing \0 */ 1N/A else if (*s ==
'\\')
1N/A else /* should always be printable */ 1N/A /* At least try a little for readability */ 1N/A else if (*s ==
'\\')
1N/A /* trigraphs - bleagh */ 1N/A else if (*s >=
' ' && *s <
127)
1N/A else if (*s ==
'\n')
1N/A else if (*s ==
'\r')
1N/A else if (*s ==
'\t')
1N/A else if (*s ==
'\a')
1N/A else if (*s ==
'\b')
1N/A else if (*s ==
'\f')
1N/A /* Don't want promotion of a signed -1 char in sprintf args */ 1N/A unsigned char c = (
unsigned char) *s;
1N/A /* XXX Add line breaks if string is long */ 1N/A else if (*s ==
'\\')
1N/A else if (*s >=
' ' && *s <
127)
1N/A else if (*s ==
'\n')
1N/A else if (*s ==
'\r')
1N/A else if (*s ==
'\t')
1N/A else if (*s ==
'\a')
1N/A else if (*s ==
'\b')
1N/A else if (*s ==
'\f')
1N/A else if (*s ==
'\v')
1N/A /* no trigraph support */ 1N/A char escbuff[
5];
/* to fit backslash, 3 octals + trailing \0 */ 1N/A /* Don't want promotion of a signed -1 char in sprintf args */ 1N/A unsigned char c = (
unsigned char) *s;
1N/A /* Use the same opsv. Rely on methods not to mess it up. */ 1N/A char hexhash[
19];
/* must fit "0xffffffffffffffff" plus trailing \0 */ 1N/A /* OP_PUSHRE stores an SV* instead of an OP* in op_pmreplroot */ 1N/A * OP_TRANS uses op_pv to point to a table of 256 or >=258 shorts 1N/A * whereas other PVOPs point to a null terminated string. 1N/A * The following way of spelling 32 is to stop compilers on 1N/A * 32-bit architectures from moaning about the shift count 1N/A * being >= the width of the type. Such architectures don't 1N/A * reach this code anyway (unless sizeof(IV) > 8 but then 1N/A * everything else breaks too so I'm not fussed at the moment). 1N/A /* XXX for backward compatibility, but should fail */ 1N/A /* croak( "argument is not SvPOK" ); */ 1N/A croak(
"REGEX is only meaningful on r-magic" );
1N/A croak(
"precomp is only meaningful on r-magic" );
1N/A /* Boyer-Moore table is just after string and its safety-margin \0 */