Changeset 757
- Timestamp:
- Aug 4, 2007, 4:08:40 AM (18 years ago)
- File:
-
- 1 edited
-
trunk/dll/literal.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/dll/literal.c
r551 r757 95 95 pszWork = pszOut = xmalloc(cBufBytes + 1, pszSrcFile, __LINE__); 96 96 97 iBuf = 0; /* set index to first character */97 iBuf = 0; /* set index to first character */ 98 98 while (pszBuf[iBuf]) { 99 99 switch (pszBuf[iBuf]) { 100 100 case '\\': 101 101 switch (pszBuf[iBuf + 1]) { 102 case 'x': /* hexadecimal */ 103 wchar = 0; 104 iBuf += 2; /* get past "\x" */ 105 if (index(HEX, (CHAR) toupper(pszBuf[iBuf])) != -1) { 106 iBufSave = iBuf; 107 while (((wpos = index(HEX, (CHAR) toupper(pszBuf[iBuf]))) != -1) && 108 iBuf < iBufSave + 2) { 109 wchar = (CHAR) (wchar << 4) + (CHAR) wpos; 110 iBuf++; 111 } 112 } 113 else 114 wchar = 'x'; /* just an x */ 115 iBuf--; 116 *pszOut++ = wchar; 117 break; 118 119 case '\\': /* we want a "\" */ 120 iBuf++; 121 *pszOut++ = '\\'; 122 break; 123 124 case 't': /* tab CHAR */ 125 iBuf++; 126 *pszOut++ = '\t'; 127 break; 128 129 case 'n': /* new line */ 130 iBuf++; 131 *pszOut++ = '\n'; 132 break; 133 134 case 'r': /* carr return */ 135 iBuf++; 136 *pszOut++ = '\r'; 137 break; 138 139 case 'b': /* back space */ 140 iBuf++; 141 *pszOut++ = '\b'; 142 break; 143 144 case 'f': /* formfeed */ 145 iBuf++; 146 *pszOut++ = '\x0c'; 147 break; 148 149 case 'a': /* bell */ 150 iBuf++; 151 *pszOut++ = '\07'; 152 break; 153 154 case '\'': /* single quote */ 155 iBuf++; 156 *pszOut++ = '\''; 157 break; 158 159 case '\"': /* double quote */ 160 iBuf++; 161 *pszOut++ = '\"'; 162 break; 163 164 default: /* decimal */ 165 iBuf++; /* get past "\" */ 166 wchar = 0; 167 if (index(DEC, pszBuf[iBuf]) != -1) { 168 iBufSave = iBuf; 169 do { /* cvt to binary */ 170 wchar = (CHAR) (wchar * 10 + (pszBuf[iBuf++] - 48)); 171 } while (index(DEC, pszBuf[iBuf]) != -1 && iBuf < iBufSave + 3); 172 iBuf--; 173 } 174 else 175 wchar = pszBuf[iBuf]; 176 *pszOut++ = wchar; 177 break; 178 } // switch 102 case 'x': /* hexadecimal */ 103 wchar = 0; 104 iBuf += 2; /* get past "\x" */ 105 if (index(HEX, (CHAR) toupper(pszBuf[iBuf])) != -1) { 106 iBufSave = iBuf; 107 while (((wpos = index(HEX, (CHAR) toupper(pszBuf[iBuf]))) != -1) && 108 iBuf < iBufSave + 2) { 109 wchar = (CHAR) (wchar << 4) + (CHAR) wpos; 110 iBuf++; 111 } 112 } 113 else 114 wchar = 'x'; /* just an x */ 115 iBuf--; 116 *pszOut++ = wchar; 117 break; 118 119 case '\\': /* we want a "\" */ 120 iBuf++; 121 *pszOut++ = '\\'; 122 break; 123 124 case 't': /* tab CHAR */ 125 iBuf++; 126 *pszOut++ = '\t'; 127 break; 128 129 case 'n': /* new line */ 130 iBuf++; 131 *pszOut++ = '\n'; 132 break; 133 134 case 'r': /* carr return */ 135 iBuf++; 136 *pszOut++ = '\r'; 137 break; 138 139 case 'b': /* back space */ 140 iBuf++; 141 *pszOut++ = '\b'; 142 break; 143 144 case 'f': /* formfeed */ 145 iBuf++; 146 *pszOut++ = '\x0c'; 147 break; 148 149 case 'a': /* bell */ 150 iBuf++; 151 *pszOut++ = '\07'; 152 break; 153 154 case '\'': /* single quote */ 155 iBuf++; 156 *pszOut++ = '\''; 157 break; 158 159 case '\"': /* double quote */ 160 161 iBuf++; 162 *pszOut++ = '\"'; 163 break; 164 165 default: /* decimal */ 166 iBuf++; /* get past "\" */ 167 wchar = 0; 168 if (index(DEC, pszBuf[iBuf]) != -1) { 169 iBufSave = iBuf; 170 do { /* cvt to binary */ 171 wchar = (CHAR) (wchar * 10 + (pszBuf[iBuf++] - 48)); 172 } while (index(DEC, pszBuf[iBuf]) != -1 && iBuf < iBufSave + 3); 173 iBuf--; 174 } 175 else 176 wchar = pszBuf[iBuf]; 177 *pszOut++ = wchar; 178 break; 179 } // switch 179 180 break; 180 181 … … 182 183 *pszOut++ = pszBuf[iBuf]; 183 184 break; 184 } // switch185 } // switch 185 186 iBuf++; 186 } // while187 *pszOut = 0; /* Always terminate, even if not string */188 189 cBufBytes = pszOut - pszWork; /* Calc string length excluding terminator */190 memcpy(pszBuf, pszWork, cBufBytes + 1); /* Overwrite including terminator */187 } // while 188 *pszOut = 0; /* Always terminate, even if not string */ 189 190 cBufBytes = pszOut - pszWork; /* Calc string length excluding terminator */ 191 memcpy(pszBuf, pszWork, cBufBytes + 1); /* Overwrite including terminator */ 191 192 free(pszWork); 192 193 193 return cBufBytes; /* Return string length */194 return cBufBytes; /* Return string length */ 194 195 } 195 196 … … 202 203 203 204 BOOL wildcard(const PSZ pszBuf, const PSZ pszWildCard, 204 const BOOL fNotFileSpec)205 const BOOL fNotFileSpec) 205 206 { 206 207 const CHAR *fstr = pszBuf; … … 210 211 while (wmatch && *fcard && *fstr) { 211 212 switch (*fcard) { 212 case '?': /* character substitution */213 case '?': /* character substitution */ 213 214 fcard++; 214 215 if (fNotFileSpec || (*fstr != '.' && *fstr != '/' && *fstr != '\\')) 215 fstr++;/* skip (match) next character */216 fstr++; /* skip (match) next character */ 216 217 break; 217 218 … … 219 220 /* find next non-wild character in wildcard */ 220 221 while (*fcard && (*fcard == '?' || *fcard == '*')) 221 fcard++;222 if (!*fcard) /* if last char of wildcard is *, it matches */223 return TRUE;222 fcard++; 223 if (!*fcard) /* if last char of wildcard is *, it matches */ 224 return TRUE; 224 225 /* skip until partition, match, or eos */ 225 226 while (*fstr && toupper(*fstr) != toupper(*fcard) && 226 (fNotFileSpec || (*fstr != '\\' &&227 *fstr != '/' && *fstr != '.')))228 fstr++;229 if (!fNotFileSpec && !*fstr) /* implicit '.' */230 if (*fcard == '.')231 fcard++;227 (fNotFileSpec || (*fstr != '\\' && 228 *fstr != '/' && *fstr != '.'))) 229 fstr++; 230 if (!fNotFileSpec && !*fstr) /* implicit '.' */ 231 if (*fcard == '.') 232 fcard++; 232 233 break; 233 234 234 235 default: 235 236 if (!fNotFileSpec && ((*fstr == '/' || *fstr == '\\') && 236 (*fcard == '/' || *fcard == '\\')))237 wmatch = TRUE;237 (*fcard == '/' || *fcard == '\\'))) 238 wmatch = TRUE; 238 239 else 239 wmatch = (toupper(*fstr) == toupper(*fcard));240 wmatch = (toupper(*fstr) == toupper(*fcard)); 240 241 fstr++; 241 242 fcard++; … … 253 254 254 255 PSZ fixup(const PCH pachIn, PSZ pszOutBuf, const UINT cBufBytes, 255 const UINT cInBytes)256 const UINT cInBytes) 256 257 { 257 258 PCH pchIn = pachIn; 258 259 PCH pchOut = pszOutBuf; 259 260 PSZ pszTemp; 260 static CHAR szTemp[5] = "\\x"; // Constant prefix261 static CHAR szTemp[5] = "\\x"; // Constant prefix 261 262 262 263 // input is a character array, not a string - may not be null terminated … … 266 267 while (pchIn - pachIn < cInBytes && pchOut - pszOutBuf + 2 < cBufBytes) { 267 268 if (!isprint(*pchIn)) { 268 if (*pchIn == '\r') {269 *pchOut++ = '\\';270 *pchOut++ = 'r';271 }272 else if (*pchIn == '\n') {273 *pchOut++ = '\\';274 *pchOut++ = 'n';275 }276 else if (*pchIn == '\b') {277 *pchOut++ = '\\';278 *pchOut++ = 'b';279 }280 else {281 sprintf(szTemp + 2, "%02hx", *pchIn);282 for (pszTemp = szTemp; *pszTemp;)283 *pchOut++ = *pszTemp++;284 }285 pchIn++;269 if (*pchIn == '\r') { 270 *pchOut++ = '\\'; 271 *pchOut++ = 'r'; 272 } 273 else if (*pchIn == '\n') { 274 *pchOut++ = '\\'; 275 *pchOut++ = 'n'; 276 } 277 else if (*pchIn == '\b') { 278 *pchOut++ = '\\'; 279 *pchOut++ = 'b'; 280 } 281 else { 282 sprintf(szTemp + 2, "%02hhx", *pchIn); 283 for (pszTemp = szTemp; *pszTemp;) 284 *pchOut++ = *pszTemp++; 285 } 286 pchIn++; 286 287 } 287 288 else if (*pchIn == '\\') { 288 *pchOut++ = '\\';289 *pchOut++ = '\\';290 pchIn++;289 *pchOut++ = '\\'; 290 *pchOut++ = '\\'; 291 pchIn++; 291 292 } 292 293 else 293 *pchOut++ = *pchIn++;294 } // while295 } // if pachIn294 *pchOut++ = *pchIn++; 295 } // while 296 } // if pachIn 296 297 *pchOut = 0; 297 298 return pszOutBuf;
Note:
See TracChangeset
for help on using the changeset viewer.
