From bd422fbce227156a3dfc9447562a53cb558ca9a8 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
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 d82ffaa15c0..b44e51da869 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';
-- 
GitLab