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