Skip to content

Commit bd422fb

Browse files
committed
Simplify scanstr(), fix broken octal-escape code.
1 parent f7c6a88 commit bd422fb

File tree

1 file changed

+50
-71
lines changed

1 file changed

+50
-71
lines changed

src/backend/parser/scansup.c

Lines changed: 50 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/parser/scansup.c,v 1.10 1998/02/26 04:33:49 momjian Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/parser/scansup.c,v 1.11 1999/02/07 23:59:59 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -29,12 +29,8 @@
2929
* if the string passed in has escaped codes, map the escape codes to actual
3030
* chars
3131
*
32-
* also, remove leading and ending quotes '"' if any
33-
*
34-
* the string passed in must be non-null
35-
*
3632
* the string returned is a pointer to static storage and should NOT
37-
* be freed by the CALLER.
33+
* be freed by the caller.
3834
* ----------------
3935
*/
4036

@@ -55,76 +51,59 @@ scanstr(char *s)
5551
{
5652
if (s[i] == '\'')
5753
{
58-
i = i + 1;
59-
if (s[i] == '\'')
60-
newStr[j] = '\'';
54+
/* Note: if scanner is working right, unescaped quotes can only
55+
* appear in pairs, so there should be another character.
56+
*/
57+
i++;
58+
newStr[j] = s[i];
6159
}
62-
else
60+
else if (s[i] == '\\')
6361
{
64-
if (s[i] == '\\')
62+
i++;
63+
switch (s[i])
6564
{
66-
i = i + 1;
67-
switch (s[i])
68-
{
69-
case '\\':
70-
newStr[j] = '\\';
71-
break;
72-
case 'b':
73-
newStr[j] = '\b';
74-
break;
75-
case 'f':
76-
newStr[j] = '\f';
77-
break;
78-
case 'n':
79-
newStr[j] = '\n';
80-
break;
81-
case 'r':
82-
newStr[j] = '\r';
83-
break;
84-
case 't':
85-
newStr[j] = '\t';
86-
break;
87-
case '"':
88-
newStr[j] = '"';
89-
break;
90-
case '\'':
91-
newStr[j] = '\'';
92-
break;
93-
case '0':
94-
case '1':
95-
case '2':
96-
case '3':
97-
case '4':
98-
case '5':
99-
case '6':
100-
case '7':
101-
{
102-
char octal[4];
103-
int k;
104-
long octVal;
65+
case 'b':
66+
newStr[j] = '\b';
67+
break;
68+
case 'f':
69+
newStr[j] = '\f';
70+
break;
71+
case 'n':
72+
newStr[j] = '\n';
73+
break;
74+
case 'r':
75+
newStr[j] = '\r';
76+
break;
77+
case 't':
78+
newStr[j] = '\t';
79+
break;
80+
case '0':
81+
case '1':
82+
case '2':
83+
case '3':
84+
case '4':
85+
case '5':
86+
case '6':
87+
case '7':
88+
{
89+
int k;
90+
long octVal = 0;
10591

106-
for (k = 0;
92+
for (k = 0;
10793
s[i + k] >= '0' && s[i + k] <= '7' && k < 3;
108-
k++)
109-
octal[k] = s[i + k];
110-
i += k - 1;
111-
octal[3] = '\0';
112-
113-
octVal = strtol(octal, 0, 8);
114-
/* elog (NOTICE, "octal = %s octVal = %d, %od", octal, octVal, octVal);*/
115-
if (octVal <= 0377)
116-
{
117-
newStr[j] = ((char) octVal);
118-
break;
119-
}
120-
}
121-
default:
122-
newStr[j] = s[i];
123-
} /* switch */
124-
} /* s[i] == '\\' */
125-
else
126-
newStr[j] = s[i];
127-
}
94+
k++)
95+
octVal = (octVal << 3) + (s[i + k] - '0');
96+
i += k - 1;
97+
newStr[j] = ((char) octVal);
98+
}
99+
break;
100+
default:
101+
newStr[j] = s[i];
102+
break;
103+
} /* switch */
104+
} /* s[i] == '\\' */
105+
else
106+
newStr[j] = s[i];
128107
j++;
129108
}
130109
newStr[j] = '\0';

0 commit comments

Comments
 (0)