|
|
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.