|
|
1.1 ! root 1: /* ! 2: * getpath (file) - read a path name ! 3: * putpath (file, path) - write a path name ! 4: * ! 5: * These subroutines cater to the possibility of unprintable ! 6: * characters in the path names being read or written, by ! 7: * using the same sort of \ conventions commonly found in ! 8: * C character constants. The result of getpath is a pointer ! 9: * to a static buffer whose contents will stay around no longer ! 10: * than the next call to getpath. When getpath is called, the ! 11: * character about to be read from the input file must be the ! 12: * first character of the path name. ! 13: */ ! 14: ! 15: #include <stdio.h> ! 16: #include <ctype.h> ! 17: #include "asd.h" ! 18: ! 19: #define CHUNK 64 ! 20: ! 21: static char *r; ! 22: static unsigned size; ! 23: ! 24: char * ! 25: getpath (file) ! 26: register FILE *file; ! 27: { ! 28: register int c; ! 29: register int len = 0; ! 30: ! 31: c = getc (file); ! 32: ! 33: while (!isspace(c) && c != EOF) { ! 34: register int i = 0, n = 0; ! 35: ! 36: /* determine the next input character */ ! 37: if (c == '\\') { ! 38: c = getc (file); ! 39: switch (c) { ! 40: ! 41: case '\\': ! 42: break; ! 43: ! 44: case 'n': ! 45: c = '\n'; ! 46: break; ! 47: ! 48: case 'r': ! 49: c = '\r'; ! 50: break; ! 51: ! 52: case 't': ! 53: c = '\t'; ! 54: break; ! 55: ! 56: case 'b': ! 57: c = '\b'; ! 58: break; ! 59: ! 60: case 'f': ! 61: c = '\f'; ! 62: break; ! 63: ! 64: case ' ': ! 65: /* c = ' '; */ ! 66: break; ! 67: ! 68: default: ! 69: while (c >= '0' && c <= '7' && i < 3) { ! 70: n = (n << 3) + c - '0'; ! 71: i++; ! 72: c = getc (file); ! 73: } ! 74: ungetc (c, file); ! 75: c = n; ! 76: break; ! 77: } ! 78: } ! 79: ! 80: /* ensure there's room in the buffer */ ! 81: if (len >= size) ! 82: r = ralloc (r, size += CHUNK); ! 83: ! 84: /* put the character in the buffer */ ! 85: r[len++] = c; ! 86: ! 87: /* read the next character */ ! 88: c = getc (file); ! 89: } ! 90: ! 91: /* unless we hit eof, we read one character too far. */ ! 92: if (c != EOF) ! 93: ungetc (c, file); ! 94: ! 95: /* put a final null into the buffer */ ! 96: if (len >= size) ! 97: r = ralloc (r, size += CHUNK); ! 98: r[len] = '\0'; ! 99: ! 100: return r; ! 101: } ! 102: ! 103: void ! 104: putpath (file, path) ! 105: register FILE *file; ! 106: char *path; ! 107: { ! 108: register char *p = path; ! 109: register int c; ! 110: ! 111: while ((c = *p++) != NULL) { ! 112: switch (c) { ! 113: ! 114: case '\n': ! 115: fprintf (file, "\\n"); ! 116: break; ! 117: ! 118: case '\r': ! 119: fprintf (file, "\\r"); ! 120: break; ! 121: ! 122: case '\b': ! 123: fprintf (file, "\\b"); ! 124: break; ! 125: ! 126: case '\t': ! 127: fprintf (file, "\\t"); ! 128: break; ! 129: ! 130: case '\f': ! 131: fprintf (file, "\\f"); ! 132: break; ! 133: ! 134: case '\\': ! 135: fprintf (file, "\\\\"); ! 136: break; ! 137: ! 138: case ' ': ! 139: fprintf (file, "\\ "); ! 140: break; ! 141: ! 142: default: ! 143: if (iscntrl (c)) ! 144: fprintf (file, ! 145: *p >= '0' && *p <= '7'? "\\%.3o": "\\%o", ! 146: c); ! 147: else ! 148: putc (c, file); ! 149: break; ! 150: } ! 151: } ! 152: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.