From bd422fbce227156a3dfc9447562a53cb558ca9a8 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 7 Feb 1999 23:59:59 +0000 Subject: [PATCH] Simplify scanstr(), fix broken octal-escape code. --- src/backend/parser/scansup.c | 121 +++++++++++++++-------------------- 1 file changed, 50 insertions(+), 71 deletions(-) diff --git a/src/backend/parser/scansup.c b/src/backend/parser/scansup.c index d82ffaa15c..b44e51da86 100644 --- a/src/backend/parser/scansup.c +++ b/src/backend/parser/scansup.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/scansup.c,v 1.10 1998/02/26 04:33:49 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/scansup.c,v 1.11 1999/02/07 23:59:59 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -29,12 +29,8 @@ * if the string passed in has escaped codes, map the escape codes to actual * chars * - * also, remove leading and ending quotes '"' if any - * - * the string passed in must be non-null - * * the string returned is a pointer to static storage and should NOT - * be freed by the CALLER. + * be freed by the caller. * ---------------- */ @@ -55,76 +51,59 @@ scanstr(char *s) { if (s[i] == '\'') { - i = i + 1; - if (s[i] == '\'') - newStr[j] = '\''; + /* Note: if scanner is working right, unescaped quotes can only + * appear in pairs, so there should be another character. + */ + i++; + newStr[j] = s[i]; } - else + else if (s[i] == '\\') { - if (s[i] == '\\') + i++; + switch (s[i]) { - i = i + 1; - switch (s[i]) - { - case '\\': - newStr[j] = '\\'; - break; - case 'b': - newStr[j] = '\b'; - break; - case 'f': - newStr[j] = '\f'; - break; - case 'n': - newStr[j] = '\n'; - break; - case 'r': - newStr[j] = '\r'; - break; - case 't': - newStr[j] = '\t'; - break; - case '"': - newStr[j] = '"'; - break; - case '\'': - newStr[j] = '\''; - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - { - char octal[4]; - int k; - long octVal; + case 'b': + newStr[j] = '\b'; + break; + case 'f': + newStr[j] = '\f'; + break; + case 'n': + newStr[j] = '\n'; + break; + case 'r': + newStr[j] = '\r'; + break; + case 't': + newStr[j] = '\t'; + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + { + int k; + long octVal = 0; - for (k = 0; + for (k = 0; s[i + k] >= '0' && s[i + k] <= '7' && k < 3; - k++) - octal[k] = s[i + k]; - i += k - 1; - octal[3] = '\0'; - - octVal = strtol(octal, 0, 8); -/* elog (NOTICE, "octal = %s octVal = %d, %od", octal, octVal, octVal);*/ - if (octVal <= 0377) - { - newStr[j] = ((char) octVal); - break; - } - } - default: - newStr[j] = s[i]; - } /* switch */ - } /* s[i] == '\\' */ - else - newStr[j] = s[i]; - } + k++) + octVal = (octVal << 3) + (s[i + k] - '0'); + i += k - 1; + newStr[j] = ((char) octVal); + } + break; + default: + newStr[j] = s[i]; + break; + } /* switch */ + } /* s[i] == '\\' */ + else + newStr[j] = s[i]; j++; } newStr[j] = '\0';