1N/A#
endif /* PERL_VERSION <= 6 */ 1N/A/* Changes in 5.7 series mean that now IOK is only set if scalar is 1N/A precisely integer but in 5.6 and earlier we need to do a more 1N/A/* does a string need to be protected? */ 1N/A/* count the number of "'"s and "\"s in string */ 1N/A if (*s ==
'\'' || *s ==
'\\')
1N/A/* returns number of chars added to escape "'"s and "\"s in s */ 1N/A/* slen number of characters in s will be escaped */ 1N/A/* destination must be long enough for additional chars */ 1N/A /* Could count 128-255 and 256+ in two variables, if we want to 1N/A be like &qquote and make a distinction. */ 1N/A /* STRLEN topbit_grow = 0; bytes needed to represent chars 128-255 */ 1N/A /* this will need EBCDICification */ 1N/A /* 4: \x{} then count the number of hex digits. */ 1N/A grow +=
4 + (k <=
0xFF ?
2 : k <=
0xFFF ?
3 : k <=
0xFFFF ?
4 :
1N/A 8 /* We may allocate a bit more than the minimum here. */ 1N/A }
else if (k ==
'\\') {
1N/A }
else if (k ==
'\'') {
1N/A }
else if (k ==
'"' || k ==
'$' || k ==
'@') {
1N/A /* We have something needing hex. 3 is ""\0 */ 1N/A if (k ==
'"' || k ==
'\\' || k ==
'$' || k ==
'@') {
1N/A /* The return value of sprintf() is unportable. 1N/A * In modern systems it returns (int) the number of characters, 1N/A * but in older systems it might return (char*) the original 1N/A * buffer, or it might even be (void). The easiest portable 1N/A * thing to do is probably use sprintf() in void context and 1N/A * then strlen(buffer) for the length. The more proper way 1N/A * would of course be to figure out the prototype of sprintf. 1N/A /* Single quotes. */ 1N/A if (k ==
'\'' || k ==
'\\')
1N/A/* append a repeated string to an SV */ 1N/A * This ought to be split into smaller functions. (it is one long function since 1N/A * it exactly parallels the perl version, which was one long thing for 1N/A * efficiency raisins.) Ugggh! 1N/A /* if it has a name, we need to either look it up, or keep a tab 1N/A * on it so we know when we hit it later 1N/A else {
/* store our name and continue */ 1N/A /* If purity is not set and maxdepth is set, then check depth: 1N/A * if we have reached maximum depth, return the string 1N/A * representation of the thing we are currently examining 1N/A * at this depth (i.e., 'Foo=ARRAY(0xdeadbeef)'). 1N/A /* allowing for a 24 char wide array index */ 1N/A /* omit "->" in $foo{bar}->[0], but not in ${$foo}->[0] */ 1N/A && name[namelen-1] != ']' && name[namelen-1] != '}' 1N/A && (namelen < 4 || (name[1] != '{' && name[2] != '{')))*/ 1N/A /* omit "->" in $foo[0]->{bar}, but not in ${$foo}->{bar} */ 1N/A warn(
"Sortkeys subroutine did not return ARRAYREF\n");
1N/A /* foreach (keys %hash) */ 1N/A for (i = 0;
1; i++) {
1N/A /* old logic was first to check utf8 flag, and if utf8 always 1N/A call esc_q_utf8. This caused test to break under -Mutf8, 1N/A because there even strings like 'c' have utf8 flag on. 1N/A Hence with quotekeys == 0 the XS code would still '' quote 1N/A them based on flags, whereas the perl code would not, 1N/A The perl code is correct. 1N/A needs_quote() decides that anything that isn't a valid 1N/A perl identifier needs to be quoted, hence only correctly 1N/A formed strings with no characters outside [A-Za-z0-9_:] 1N/A won't need quoting. None of those characters are used in 1N/A the byte encoding of utf8, so anything with utf8 1N/A encoded characters in will need quoting. Hence strings 1N/A with utf8 encoded characters in will end up inside do_utf8 1N/A just like before, but now strings with utf8 flag set but 1N/A only ascii characters will end up in the unquoted section. 1N/A There should also be less tests for the (probably currently) 1N/A more common doesn't need quoting case. 1N/A The code is also smaller (22044 vs 22260) because I've been 1N/A able to pull the common logic out to both sides. */ 1N/A warn(
"Encountered CODE ref, using dummy placeholder");
1N/A /* Need to check to see if this is a string such as " 0". 1N/A I'm assuming from sprintf isn't going to clash with utf8. 1N/A Is this valid on EBCDIC? */ 1N/A /* Looks like we're on a 64 bit system. Make it a string so that 1N/A if a 32 bit system reads the number it will cope better. */ 1N/A ++c; --i;
/* just get the name */ 1N/A r[0] =
'*'; r[
1] =
'{'; r[
2] =
'\'';
1N/A r[i++] =
'\''; r[i++] =
'}';
1N/A static char *
entries[] = {
"{SCALAR}",
"{ARRAY}",
"{HASH}" };
1N/A for (j=0; j<
3; j++) {
1N/A croak(
"Usage: Data::Dumper::Dumpxs(PACKAGE, VAL_ARY_REF, [NAME_ARY_REF])");
1N/A#
if 0
/* useqq currently unused */ 1N/A /* flag to use qsortsv() for sorting hash keys */ 1N/A if (i <
imax)
/* not the last time thro ? */ 1N/A croak(
"Call to new() method failed to return HASH ref");