Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitbd422fb

Browse files
committed
Simplify scanstr(), fix broken octal-escape code.
1 parentf7c6a88 commitbd422fb

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 theCALLER.
33+
* be freed by thecaller.
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+
elseif (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-
charoctal[4];
103-
intk;
104-
longoctVal;
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+
intk;
90+
longoctVal=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)

[8]ページ先頭

©2009-2025 Movatter.jp