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"
7 e8fb1d3e 2004-05-17 devnull #undef isspace
8 e8fb1d3e 2004-05-17 devnull #define isspace risspace
11 61f5c35c 2004-05-15 devnull isspace(Rune r)
13 61f5c35c 2004-05-15 devnull return(r==' ' || r=='\t' || r=='\n' || r == '\r' || r=='\f');
17 e8fb1d3e 2004-05-17 devnull Bskipws(Biobuf *bp) {
19 61f5c35c 2004-05-15 devnull int sindex = 0;
21 61f5c35c 2004-05-15 devnull /* skip over initial white space */
23 61f5c35c 2004-05-15 devnull r = Bgetrune(bp);
24 61f5c35c 2004-05-15 devnull if (r == '\n') inputlineno++;
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;
33 61f5c35c 2004-05-15 devnull return(sindex);
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');
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');
48 61f5c35c 2004-05-15 devnull return(-1);
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.
59 e8fb1d3e 2004-05-17 devnull Bgetfield(Biobuf *bp, int type, void *thing, int size) {
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;
67 61f5c35c 2004-05-15 devnull unsigned int u = 0;
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);
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++) {
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;
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;
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);
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);
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++) {
110 a8ec4910 2005-07-13 devnull if (r == '0') {
111 61f5c35c 2004-05-15 devnull base = 8;
112 61f5c35c 2004-05-15 devnull continue;
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;
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);
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);
128 61f5c35c 2004-05-15 devnull case 's':
130 61f5c35c 2004-05-15 devnull while ((size>j+UTFmax) && (r = Bgetrune(bp))>=0 && !isspace(r)) {
132 61f5c35c 2004-05-15 devnull i = runetochar(&(((char *)thing)[j]), &R);
134 61f5c35c 2004-05-15 devnull sindex++;
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);
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);
146 61f5c35c 2004-05-15 devnull if (r <= 0) return(-1);
147 61f5c35c 2004-05-15 devnull Bungetrune(bp);
149 61f5c35c 2004-05-15 devnull default:
150 61f5c35c 2004-05-15 devnull return(-2);
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);
157 61f5c35c 2004-05-15 devnull return(sindex);