*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
* 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.
* ----------------
*/
{
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';