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 fa325e9b 2020-01-10 cross 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 fa325e9b 2020-01-10 cross * "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 int sindex = 0, i, j, n = 0;
63 61f5c35c 2004-05-15 devnull int negate = 0;
64 61f5c35c 2004-05-15 devnull int base = 10;
65 61f5c35c 2004-05-15 devnull BOOLEAN bailout = FALSE;
66 61f5c35c 2004-05-15 devnull int dig;
67 61f5c35c 2004-05-15 devnull unsigned int u = 0;
68 61f5c35c 2004-05-15 devnull
69 e8fb1d3e 2004-05-17 devnull r = 0;
70 e8fb1d3e 2004-05-17 devnull
71 61f5c35c 2004-05-15 devnull /* skip over initial white space */
72 61f5c35c 2004-05-15 devnull if (Bskipws(bp) < 0)
73 61f5c35c 2004-05-15 devnull return(-1);
74 61f5c35c 2004-05-15 devnull
75 61f5c35c 2004-05-15 devnull switch (type) {
76 61f5c35c 2004-05-15 devnull case 'd':
77 61f5c35c 2004-05-15 devnull while (!bailout && (r = Bgetrune(bp))>=0) {
78 61f5c35c 2004-05-15 devnull switch (sindex++) {
79 61f5c35c 2004-05-15 devnull case 0:
80 61f5c35c 2004-05-15 devnull switch (r) {
81 61f5c35c 2004-05-15 devnull case '-':
82 61f5c35c 2004-05-15 devnull negate = 1;
83 61f5c35c 2004-05-15 devnull continue;
84 61f5c35c 2004-05-15 devnull case '+':
85 61f5c35c 2004-05-15 devnull continue;
86 61f5c35c 2004-05-15 devnull case '0':
87 61f5c35c 2004-05-15 devnull base = 8;
88 61f5c35c 2004-05-15 devnull continue;
89 fa325e9b 2020-01-10 cross default:
90 61f5c35c 2004-05-15 devnull break;
91 61f5c35c 2004-05-15 devnull }
92 61f5c35c 2004-05-15 devnull break;
93 61f5c35c 2004-05-15 devnull case 1:
94 61f5c35c 2004-05-15 devnull if ((r == 'x' || r == 'X') && base == 8) {
95 61f5c35c 2004-05-15 devnull base = 16;
96 61f5c35c 2004-05-15 devnull continue;
97 61f5c35c 2004-05-15 devnull }
98 61f5c35c 2004-05-15 devnull }
99 fa325e9b 2020-01-10 cross if ((dig = asc2dig(r, base)) == -1) bailout = TRUE;
100 61f5c35c 2004-05-15 devnull else n = dig + (n * base);
101 61f5c35c 2004-05-15 devnull }
102 61f5c35c 2004-05-15 devnull if (r < 0) return(-1);
103 61f5c35c 2004-05-15 devnull *(int *)thing = (negate)?-n:n;
104 61f5c35c 2004-05-15 devnull Bungetrune(bp);
105 61f5c35c 2004-05-15 devnull break;
106 61f5c35c 2004-05-15 devnull case 'u':
107 61f5c35c 2004-05-15 devnull while (!bailout && (r = Bgetrune(bp))>=0) {
108 61f5c35c 2004-05-15 devnull switch (sindex++) {
109 61f5c35c 2004-05-15 devnull case 0:
110 a8ec4910 2005-07-13 devnull if (r == '0') {
111 61f5c35c 2004-05-15 devnull base = 8;
112 61f5c35c 2004-05-15 devnull continue;
113 61f5c35c 2004-05-15 devnull }
114 61f5c35c 2004-05-15 devnull break;
115 61f5c35c 2004-05-15 devnull case 1:
116 61f5c35c 2004-05-15 devnull if ((r == 'x' || r == 'X') && base == 8) {
117 61f5c35c 2004-05-15 devnull base = 16;
118 61f5c35c 2004-05-15 devnull continue;
119 61f5c35c 2004-05-15 devnull }
120 61f5c35c 2004-05-15 devnull }
121 fa325e9b 2020-01-10 cross if ((dig = asc2dig(r, base)) == -1) bailout = TRUE;
122 61f5c35c 2004-05-15 devnull else u = dig + (n * base);
123 61f5c35c 2004-05-15 devnull }
124 61f5c35c 2004-05-15 devnull *(int *)thing = u;
125 61f5c35c 2004-05-15 devnull if (r < 0) return(-1);
126 61f5c35c 2004-05-15 devnull Bungetrune(bp);
127 61f5c35c 2004-05-15 devnull break;
128 61f5c35c 2004-05-15 devnull case 's':
129 61f5c35c 2004-05-15 devnull j = 0;
130 61f5c35c 2004-05-15 devnull while ((size>j+UTFmax) && (r = Bgetrune(bp))>=0 && !isspace(r)) {
131 61f5c35c 2004-05-15 devnull R = r;
132 61f5c35c 2004-05-15 devnull i = runetochar(&(((char *)thing)[j]), &R);
133 61f5c35c 2004-05-15 devnull j += i;
134 61f5c35c 2004-05-15 devnull sindex++;
135 61f5c35c 2004-05-15 devnull }
136 61f5c35c 2004-05-15 devnull ((char *)thing)[j++] = '\0';
137 61f5c35c 2004-05-15 devnull if (r < 0) return(-1);
138 61f5c35c 2004-05-15 devnull Bungetrune(bp);
139 61f5c35c 2004-05-15 devnull break;
140 61f5c35c 2004-05-15 devnull case 'r':
141 61f5c35c 2004-05-15 devnull if ((r = Bgetrune(bp))>=0) {
142 61f5c35c 2004-05-15 devnull *(Rune *)thing = r;
143 61f5c35c 2004-05-15 devnull sindex++;
144 61f5c35c 2004-05-15 devnull return(sindex);
145 61f5c35c 2004-05-15 devnull }
146 61f5c35c 2004-05-15 devnull if (r <= 0) return(-1);
147 61f5c35c 2004-05-15 devnull Bungetrune(bp);
148 61f5c35c 2004-05-15 devnull break;
149 61f5c35c 2004-05-15 devnull default:
150 61f5c35c 2004-05-15 devnull return(-2);
151 61f5c35c 2004-05-15 devnull }
152 61f5c35c 2004-05-15 devnull if (r < 0 && sindex == 0)
153 61f5c35c 2004-05-15 devnull return(r);
154 61f5c35c 2004-05-15 devnull else if (bailout && sindex == 1) {
155 61f5c35c 2004-05-15 devnull return(0);
156 61f5c35c 2004-05-15 devnull } else
157 61f5c35c 2004-05-15 devnull return(sindex);
158 61f5c35c 2004-05-15 devnull }