Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "postgres.h"
00017
00018 #include <ctype.h>
00019
00020 #include "parser/scansup.h"
00021 #include "mb/pg_wchar.h"
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 char *
00036 scanstr(const char *s)
00037 {
00038 char *newStr;
00039 int len,
00040 i,
00041 j;
00042
00043 if (s == NULL || s[0] == '\0')
00044 return pstrdup("");
00045
00046 len = strlen(s);
00047
00048 newStr = palloc(len + 1);
00049
00050 for (i = 0, j = 0; i < len; i++)
00051 {
00052 if (s[i] == '\'')
00053 {
00054
00055
00056
00057
00058 i++;
00059
00060 Assert(s[i] == '\'');
00061 newStr[j] = s[i];
00062 }
00063 else if (s[i] == '\\')
00064 {
00065 i++;
00066 switch (s[i])
00067 {
00068 case 'b':
00069 newStr[j] = '\b';
00070 break;
00071 case 'f':
00072 newStr[j] = '\f';
00073 break;
00074 case 'n':
00075 newStr[j] = '\n';
00076 break;
00077 case 'r':
00078 newStr[j] = '\r';
00079 break;
00080 case 't':
00081 newStr[j] = '\t';
00082 break;
00083 case '0':
00084 case '1':
00085 case '2':
00086 case '3':
00087 case '4':
00088 case '5':
00089 case '6':
00090 case '7':
00091 {
00092 int k;
00093 long octVal = 0;
00094
00095 for (k = 0;
00096 s[i + k] >= '0' && s[i + k] <= '7' && k < 3;
00097 k++)
00098 octVal = (octVal << 3) + (s[i + k] - '0');
00099 i += k - 1;
00100 newStr[j] = ((char) octVal);
00101 }
00102 break;
00103 default:
00104 newStr[j] = s[i];
00105 break;
00106 }
00107 }
00108 else
00109 newStr[j] = s[i];
00110 j++;
00111 }
00112 newStr[j] = '\0';
00113 return newStr;
00114 }
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130 char *
00131 downcase_truncate_identifier(const char *ident, int len, bool warn)
00132 {
00133 char *result;
00134 int i;
00135
00136 result = palloc(len + 1);
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147 for (i = 0; i < len; i++)
00148 {
00149 unsigned char ch = (unsigned char) ident[i];
00150
00151 if (ch >= 'A' && ch <= 'Z')
00152 ch += 'a' - 'A';
00153 else if (IS_HIGHBIT_SET(ch) && isupper(ch))
00154 ch = tolower(ch);
00155 result[i] = (char) ch;
00156 }
00157 result[i] = '\0';
00158
00159 if (i >= NAMEDATALEN)
00160 truncate_identifier(result, i, warn);
00161
00162 return result;
00163 }
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174 void
00175 truncate_identifier(char *ident, int len, bool warn)
00176 {
00177 if (len >= NAMEDATALEN)
00178 {
00179 len = pg_mbcliplen(ident, len, NAMEDATALEN - 1);
00180 if (warn)
00181 {
00182
00183
00184
00185
00186 char buf[NAMEDATALEN];
00187
00188 memcpy(buf, ident, len);
00189 buf[len] = '\0';
00190 ereport(NOTICE,
00191 (errcode(ERRCODE_NAME_TOO_LONG),
00192 errmsg("identifier \"%s\" will be truncated to \"%s\"",
00193 ident, buf)));
00194 }
00195 ident[len] = '\0';
00196 }
00197 }
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208 bool
00209 scanner_isspace(char ch)
00210 {
00211
00212 if (ch == ' ' ||
00213 ch == '\t' ||
00214 ch == '\n' ||
00215 ch == '\r' ||
00216 ch == '\f')
00217 return true;
00218 return false;
00219 }