Simplify scanstr(), fix broken octal-escape code.
authorTom Lane
Sun, 7 Feb 1999 23:59:59 +0000 (23:59 +0000)
committerTom Lane
Sun, 7 Feb 1999 23:59:59 +0000 (23:59 +0000)
src/backend/parser/scansup.c

index d82ffaa15c041147a7f81955ce6614da6fe5215f..b44e51da86922b9ce4ef4b687abf02c9991b7388 100644 (file)
@@ -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 $
  *
  *-------------------------------------------------------------------------
  */
  * 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';