Blame


1 61f5c35c 2004-05-15 devnull #include <u.h>
2 61f5c35c 2004-05-15 devnull #include <libc.h>
3 61f5c35c 2004-05-15 devnull #include <bio.h>
4 61f5c35c 2004-05-15 devnull #include "../common/common.h"
5 61f5c35c 2004-05-15 devnull #include "tr2post.h"
6 61f5c35c 2004-05-15 devnull
7 e8fb1d3e 2004-05-17 devnull #undef isspace
8 e8fb1d3e 2004-05-17 devnull #define isspace risspace
9 e8fb1d3e 2004-05-17 devnull
10 61f5c35c 2004-05-15 devnull int
11 61f5c35c 2004-05-15 devnull isspace(Rune r)
12 61f5c35c 2004-05-15 devnull {
13 61f5c35c 2004-05-15 devnull return(r==' ' || r=='\t' || r=='\n' || r == '\r' || r=='\f');
14 61f5c35c 2004-05-15 devnull }
15 61f5c35c 2004-05-15 devnull
16 61f5c35c 2004-05-15 devnull int
17 e8fb1d3e 2004-05-17 devnull Bskipws(Biobuf *bp) {
18 61f5c35c 2004-05-15 devnull int r;
19 61f5c35c 2004-05-15 devnull int sindex = 0;
20 61f5c35c 2004-05-15 devnull
21 61f5c35c 2004-05-15 devnull /* skip over initial white space */
22 61f5c35c 2004-05-15 devnull do {
23 61f5c35c 2004-05-15 devnull r = Bgetrune(bp);
24 61f5c35c 2004-05-15 devnull if (r == '\n') inputlineno++;
25 61f5c35c 2004-05-15 devnull sindex++;
26 61f5c35c 2004-05-15 devnull } while (r>=0 && isspace(r));
27 61f5c35c 2004-05-15 devnull if (r<0) {
28 61f5c35c 2004-05-15 devnull return(-1);
29 61f5c35c 2004-05-15 devnull } else if (!isspace(r)) {
30 61f5c35c 2004-05-15 devnull Bungetrune(bp);
31 61f5c35c 2004-05-15 devnull --sindex;
32 61f5c35c 2004-05-15 devnull }
33 61f5c35c 2004-05-15 devnull return(sindex);
34 61f5c35c 2004-05-15 devnull }
35 61f5c35c 2004-05-15 devnull
36 61f5c35c 2004-05-15 devnull int
37 61f5c35c 2004-05-15 devnull asc2dig(char c, int base) {
38 b855148c 2004-05-16 devnull if (c >= '0' && c <= '9'){
39 61f5c35c 2004-05-15 devnull if (base == 8 && c > '7') return(-1);
40 61f5c35c 2004-05-15 devnull else return(c - '0');
41 b855148c 2004-05-16 devnull }
42 61f5c35c 2004-05-15 devnull
43 b855148c 2004-05-16 devnull if (base == 16){
44 61f5c35c 2004-05-15 devnull if (c >= 'a' && c <= 'f') return(10 + c - 'a');
45 61f5c35c 2004-05-15 devnull else if (c >= 'A' && c <= 'F') return(10 + c - 'A');
46 b855148c 2004-05-16 devnull }
47 61f5c35c 2004-05-15 devnull
48 61f5c35c 2004-05-15 devnull return(-1);
49 61f5c35c 2004-05-15 devnull }
50 61f5c35c 2004-05-15 devnull
51 61f5c35c 2004-05-15 devnull /* get a string of type: "d" for decimal integer, "u" for unsigned,
52 61f5c35c 2004-05-15 devnull * "s" for string", "c" for char,
53 61f5c35c 2004-05-15 devnull * return the number of characters gotten for the field. If nothing
54 61f5c35c 2004-05-15 devnull * was gotten and the end of file was reached, a negative value
55 61f5c35c 2004-05-15 devnull * from the Bgetrune is returned.
56 61f5c35c 2004-05-15 devnull */
57 61f5c35c 2004-05-15 devnull
58 61f5c35c 2004-05-15 devnull int
59 e8fb1d3e 2004-05-17 devnull Bgetfield(Biobuf *bp, int type, void *thing, int size) {
60 61f5c35c 2004-05-15 devnull int r;
61 61f5c35c 2004-05-15 devnull Rune R;
62 61f5c35c 2004-05-15 devnull char c[UTFmax];
63 61f5c35c 2004-05-15 devnull int sindex = 0, i, j, n = 0;
64 61f5c35c 2004-05-15 devnull int negate = 0;
65 61f5c35c 2004-05-15 devnull int base = 10;
66 61f5c35c 2004-05-15 devnull BOOLEAN bailout = FALSE;
67 61f5c35c 2004-05-15 devnull int dig;
68 61f5c35c 2004-05-15 devnull unsigned int u = 0;
69 61f5c35c 2004-05-15 devnull
70 e8fb1d3e 2004-05-17 devnull r = 0;
71 e8fb1d3e 2004-05-17 devnull
72 61f5c35c 2004-05-15 devnull /* skip over initial white space */
73 61f5c35c 2004-05-15 devnull if (Bskipws(bp) < 0)
74 61f5c35c 2004-05-15 devnull return(-1);
75 61f5c35c 2004-05-15 devnull
76 61f5c35c 2004-05-15 devnull switch (type) {
77 61f5c35c 2004-05-15 devnull case 'd':
78 61f5c35c 2004-05-15 devnull while (!bailout && (r = Bgetrune(bp))>=0) {
79 61f5c35c 2004-05-15 devnull switch (sindex++) {
80 61f5c35c 2004-05-15 devnull case 0:
81 61f5c35c 2004-05-15 devnull switch (r) {
82 61f5c35c 2004-05-15 devnull case '-':
83 61f5c35c 2004-05-15 devnull negate = 1;
84 61f5c35c 2004-05-15 devnull continue;
85 61f5c35c 2004-05-15 devnull case '+':
86 61f5c35c 2004-05-15 devnull continue;
87 61f5c35c 2004-05-15 devnull case '0':
88 61f5c35c 2004-05-15 devnull base = 8;
89 61f5c35c 2004-05-15 devnull continue;
90 61f5c35c 2004-05-15 devnull default:
91 61f5c35c 2004-05-15 devnull break;
92 61f5c35c 2004-05-15 devnull }
93 61f5c35c 2004-05-15 devnull break;
94 61f5c35c 2004-05-15 devnull case 1:
95 61f5c35c 2004-05-15 devnull if ((r == 'x' || r == 'X') && base == 8) {
96 61f5c35c 2004-05-15 devnull base = 16;
97 61f5c35c 2004-05-15 devnull continue;
98 61f5c35c 2004-05-15 devnull }
99 61f5c35c 2004-05-15 devnull }
100 61f5c35c 2004-05-15 devnull if ((dig = asc2dig(r, base)) == -1) bailout = TRUE;
101 61f5c35c 2004-05-15 devnull else n = dig + (n * base);
102 61f5c35c 2004-05-15 devnull }
103 61f5c35c 2004-05-15 devnull if (r < 0) return(-1);
104 61f5c35c 2004-05-15 devnull *(int *)thing = (negate)?-n:n;
105 61f5c35c 2004-05-15 devnull Bungetrune(bp);
106 61f5c35c 2004-05-15 devnull break;
107 61f5c35c 2004-05-15 devnull case 'u':
108 61f5c35c 2004-05-15 devnull while (!bailout && (r = Bgetrune(bp))>=0) {
109 61f5c35c 2004-05-15 devnull switch (sindex++) {
110 61f5c35c 2004-05-15 devnull case 0:
111 61f5c35c 2004-05-15 devnull if (*c == '0') {
112 61f5c35c 2004-05-15 devnull base = 8;
113 61f5c35c 2004-05-15 devnull continue;
114 61f5c35c 2004-05-15 devnull }
115 61f5c35c 2004-05-15 devnull break;
116 61f5c35c 2004-05-15 devnull case 1:
117 61f5c35c 2004-05-15 devnull if ((r == 'x' || r == 'X') && base == 8) {
118 61f5c35c 2004-05-15 devnull base = 16;
119 61f5c35c 2004-05-15 devnull continue;
120 61f5c35c 2004-05-15 devnull }
121 61f5c35c 2004-05-15 devnull }
122 61f5c35c 2004-05-15 devnull if ((dig = asc2dig(r, base)) == -1) bailout = TRUE;
123 61f5c35c 2004-05-15 devnull else u = dig + (n * base);
124 61f5c35c 2004-05-15 devnull }
125 61f5c35c 2004-05-15 devnull *(int *)thing = u;
126 61f5c35c 2004-05-15 devnull if (r < 0) return(-1);
127 61f5c35c 2004-05-15 devnull Bungetrune(bp);
128 61f5c35c 2004-05-15 devnull break;
129 61f5c35c 2004-05-15 devnull case 's':
130 61f5c35c 2004-05-15 devnull j = 0;
131 61f5c35c 2004-05-15 devnull while ((size>j+UTFmax) && (r = Bgetrune(bp))>=0 && !isspace(r)) {
132 61f5c35c 2004-05-15 devnull R = r;
133 61f5c35c 2004-05-15 devnull i = runetochar(&(((char *)thing)[j]), &R);
134 61f5c35c 2004-05-15 devnull j += i;
135 61f5c35c 2004-05-15 devnull sindex++;
136 61f5c35c 2004-05-15 devnull }
137 61f5c35c 2004-05-15 devnull ((char *)thing)[j++] = '\0';
138 61f5c35c 2004-05-15 devnull if (r < 0) return(-1);
139 61f5c35c 2004-05-15 devnull Bungetrune(bp);
140 61f5c35c 2004-05-15 devnull break;
141 61f5c35c 2004-05-15 devnull case 'r':
142 61f5c35c 2004-05-15 devnull if ((r = Bgetrune(bp))>=0) {
143 61f5c35c 2004-05-15 devnull *(Rune *)thing = r;
144 61f5c35c 2004-05-15 devnull sindex++;
145 61f5c35c 2004-05-15 devnull return(sindex);
146 61f5c35c 2004-05-15 devnull }
147 61f5c35c 2004-05-15 devnull if (r <= 0) return(-1);
148 61f5c35c 2004-05-15 devnull Bungetrune(bp);
149 61f5c35c 2004-05-15 devnull break;
150 61f5c35c 2004-05-15 devnull default:
151 61f5c35c 2004-05-15 devnull return(-2);
152 61f5c35c 2004-05-15 devnull }
153 61f5c35c 2004-05-15 devnull if (r < 0 && sindex == 0)
154 61f5c35c 2004-05-15 devnull return(r);
155 61f5c35c 2004-05-15 devnull else if (bailout && sindex == 1) {
156 61f5c35c 2004-05-15 devnull return(0);
157 61f5c35c 2004-05-15 devnull } else
158 61f5c35c 2004-05-15 devnull return(sindex);
159 61f5c35c 2004-05-15 devnull }