|
|
1.1 root 1: /*
2: * miscellaneous common routines for config
3: */
4:
5: #include <libc.h>
6: #include <ctype.h>
7: #include "mkconf.h"
8:
9: /*
10: * little routines for input
11: */
12:
13: int
14: crack(p, a, n)
15: char *p;
16: char **a;
17: int n;
18: {
19: register char *rp;
20:
21: if ((rp = strchr(p, '#')) != NULL)
22: *rp = 0;
23: return (getmfields(p, a, n));
24: }
25:
26: /*
27: * common parsing hack for device addresses
28: */
29:
30: char *
31: keyread(lp, ap, n, kp)
32: register long *lp;
33: register char **ap;
34: int n;
35: register char **kp;
36: {
37: register int i;
38:
39: for (; n > 1; n-=2, ap+=2) {
40: for (i = 0; kp[i]; i++)
41: if (strcmp(ap[0], kp[i]) == 0) {
42: lp[i] = nconv(ap[1]);
43: break;
44: }
45: if (kp[i] == 0)
46: return (*ap); /* unknown keyword */
47: }
48: return (NULL);
49: }
50:
51: /*
52: * 0nnn -> octal
53: * 0xnnn -> hex
54: * nnn -> decimal
55: */
56: long
57: nconv(a)
58: register char *a;
59: {
60: register long n;
61: register int base, d;
62: register int sign;
63:
64: base = 10;
65: sign = 1;
66: n = 0;
67: if (*a == '-') {
68: sign = -1;
69: a++;
70: }
71: if (*a == '0') {
72: base = 8;
73: a++;
74: if (*a == 'x' || *a == 'X') {
75: base = 16;
76: a++;
77: }
78: }
79: for (; isxdigit(*a); a++) {
80: d = *a - '0';
81: if (*a >= 'a')
82: d -= 'a' - '0' - 10;
83: else if (*a >= 'A')
84: d -= 'A' - '0' - 10;
85: if (d >= base)
86: break;
87: n = n * base + d;
88: }
89: return (n * sign);
90: }
91:
92: Mdev *
93: mdlook(name)
94: char *name;
95: {
96: register Mdev *mp;
97:
98: for (mp = mlist; mp; mp = mp->next)
99: if (strcmp(mp->name, name) == 0)
100: return (mp);
101: return (NULL);
102: }
103:
104: /*
105: * skip to next type of device in dlist
106: */
107:
108: Dev *
109: advtype(dp)
110: register Dev *dp;
111: {
112: register Dev *ep;
113:
114: for (ep = dp; ep && ep->mdev == dp->mdev; ep = ep->next)
115: ;
116: return (ep);
117: }
118:
119: /*
120: * look up a driver in a table
121: */
122:
123: int
124: tablook(mp, tab, lim)
125: register Mdev *mp;
126: register Devtab *tab;
127: register int lim;
128: {
129: register int i;
130:
131: for (i = 0; i <= lim; i++, tab++)
132: if (tab->dev == mp)
133: return (i);
134: return (-1);
135: }
136:
137: /*
138: * miscellany
139: */
140:
141: char *
142: ealloc(size)
143: int size;
144: {
145: char *p;
146:
147: if ((p = malloc(size)) != NULL)
148: return (p);
149: fprint(STDERR, "out of memory\n");
150: exit(1);
151: }
152:
153: char *
154: estrdup(s)
155: char *s;
156: {
157: char *t;
158:
159: t = ealloc(strlen(s)+1);
160: strcpy(t, s);
161: return (t);
162: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.