| 307 | } |
| 308 | |
| 309 | static int fieldbackch (str, out, strip) |
| 310 | register char * str; /* First char of backslash sequence */ |
| 311 | register char ** out; /* Where to store result */ |
| 312 | int strip; /* NZ to convert the sequence */ |
| 313 | { |
| 314 | register int ch; /* Character being developed */ |
| 315 | char * origstr; /* Original value of str */ |
| 316 | |
| 317 | if (!strip) |
| 318 | { |
| 319 | *(*out)++ = '\\'; |
| 320 | if (*str != 'x' && *str != 'X' && (*str < '0' || *str > '7')) |
| 321 | { |
| 322 | *(*out)++ = *str; |
| 323 | return *str != '\0'; |
| 324 | } |
| 325 | } |
| 326 | switch (*str) |
| 327 | { |
| 328 | case '\0': |
| 329 | *(*out)++ = '\0'; |
| 330 | return 0; |
| 331 | case 'a': |
| 332 | *(*out)++ = '\007'; |
| 333 | return 1; |
| 334 | case 'b': |
| 335 | *(*out)++ = '\b'; |
| 336 | return 1; |
| 337 | case 'f': |
| 338 | *(*out)++ = '\f'; |
| 339 | return 1; |
| 340 | case 'n': |
| 341 | *(*out)++ = '\n'; |
| 342 | return 1; |
| 343 | case 'r': |
| 344 | *(*out)++ = '\r'; |
| 345 | return 1; |
| 346 | case 'v': |
| 347 | *(*out)++ = '\v'; |
| 348 | return 1; |
| 349 | case 'X': |
| 350 | case 'x': |
| 351 | /* Hexadecimal sequence */ |
| 352 | origstr = str++; |
| 353 | ch = 0; |
| 354 | if (*str >= '0' && *str <= '9') |
| 355 | ch = *str++ - '0'; |
| 356 | else if (*str >= 'a' && *str <= 'f') |
| 357 | ch = *str++ - 'a' + 0xa; |
| 358 | else if (*str >= 'A' && *str <= 'F') |
| 359 | ch = *str++ - 'A' + 0xa; |
| 360 | if (*str >= '0' && *str <= '9') |
| 361 | ch = (ch << 4) | (*str++ - '0'); |
| 362 | else if (*str >= 'a' && *str <= 'f') |
| 363 | ch = (ch << 4) | (*str++ - 'a' + 0xa); |
| 364 | else if (*str >= 'A' && *str <= 'F') |
| 365 | ch = (ch << 4) | (*str++ - 'A' + 0xa); |
| 366 | break; |