8
8
*
9
9
*
10
10
* 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 $
12
12
*
13
13
*-------------------------------------------------------------------------
14
14
*/
29
29
* if the string passed in has escaped codes, map the escape codes to actual
30
30
* chars
31
31
*
32
- * also, remove leading and ending quotes '"' if any
33
- *
34
- * the string passed in must be non-null
35
- *
36
32
* the string returned is a pointer to static storage and should NOT
37
- * be freed by theCALLER .
33
+ * be freed by thecaller .
38
34
* ----------------
39
35
*/
40
36
@@ -55,76 +51,59 @@ scanstr(char *s)
55
51
{
56
52
if (s [i ]== '\'' )
57
53
{
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 ];
61
59
}
62
- else
60
+ else if ( s [ i ] == '\\' )
63
61
{
64
- if (s [i ]== '\\' )
62
+ i ++ ;
63
+ switch (s [i ])
65
64
{
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 ;
105
91
106
- for (k = 0 ;
92
+ for (k = 0 ;
107
93
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 ];
128
107
j ++ ;
129
108
}
130
109
newStr [j ]= '\0' ;