1: /*
2: * Read the device table into internal structures
3: */
4:
5: #include <stdio.h>
6: #include <ctype.h>
7: #include <sys/autoconfig.h>
8: #include "dtab.h"
9: #include "uprobe.h"
10:
11: static int line; /* Line number in dtab file */
12: FILE *dtab_fp; /* File pointer to dtab file */
13: int guess_ndev = 0; /* Guess as to size of nlist table */
14:
15: otoi(cp)
16: char *cp;
17: {
18: int res;
19:
20: sscanf(cp, "%o", &res);
21: return res;
22: }
23:
24: int last_ch; /* last character read by getword */
25:
26: #define read_while(expr) while ((ch = getc(dtab_fp)) != EOF && (expr))
27: char *getword()
28: {
29: static char buf[80];
30: register int ch;
31: register char *cp;
32:
33: if (feof(dtab_fp))
34: return NULL;
35: /* First skip any white space */
36: skip:
37: last_ch = EOF;
38: read_while(isspace(ch))
39: ;
40: if (ch == EOF)
41: return NULL;
42:
43: /* If its a comment, skip it too */
44: if (ch == '#') {
45: read_while(ch != '\n')
46: ;
47: if (ch == EOF)
48: return NULL;
49: goto skip;
50: }
51: cp = buf;
52: do {
53: *cp++ = ch;
54: *cp = '\0';
55: if ((ch = getc(dtab_fp)) == EOF)
56: return buf;
57: } while (!isspace(ch));
58: last_ch = ch;
59: return buf;
60: }
61:
62: char *nextword()
63: {
64: register char *cp;
65:
66: if ((cp = getword()) == NULL) {
67: fprintf(stderr, "Syntax error, not enough data on line %d\n", line);
68: exit(AC_SINGLE);
69: }
70: return cp;
71: }
72:
73: /*
74: * Format of lines in the device table are:
75: * DNAME NUM ADDR VEC BR (HANDLER ...) SEMICOLON COMMENT
76: * From a '#' to end of line is also considered a comment
77: */
78:
79: read_dtab()
80: {
81: char *cp;
82: register struct dtab_s *dp, *cdp;
83: struct handler_s *sp;
84: struct uprobe *up;
85: int nhandlers;
86:
87: line = 0;
88: devs = NULL;
89: while ((cp = getword()) != NULL) {
90: line++;
91: dp = malloc(sizeof *dp);
92: dp->dt_name = strsave(cp);
93: if (*(cp = nextword()) == '?')
94: dp->dt_unit = -1;
95: else
96: dp->dt_unit = atoi(cp);
97: dp->dt_addr = otoi(nextword());
98: dp->dt_vector = otoi(nextword());
99: dp->dt_br = otoi(nextword());
100: dp->dt_probe = dp->dt_attach = 0;
101: dp->dt_handlers = NULL;
102: nhandlers = 0;
103: while (strcmp((cp = nextword()), ";")) {
104: if (++nhandlers == 4)
105: fprintf(stderr, "Warning, more than three handlers for device %s on line %d.\n", dp->dt_name, line);
106: addent(&dp->dt_handlers, strsave(cp));
107: guess_ndev++;
108: }
109: guess_ndev += 2;
110: for (up = uprobe; up->up_name; up++) {
111: if (!strcmp(dp->dt_name, up->up_name)) {
112: dp->dt_uprobe = up->up_func;
113: break;
114: }
115: }
116: /*
117: * Skip the rest of the line (comment field).
118: */
119: while (last_ch != '\n' && last_ch != EOF)
120: last_ch = getc(dtab_fp);
121: dp->dt_next = NULL;
122: if (devs == NULL)
123: devs = cdp = dp;
124: else {
125: cdp->dt_next = dp;
126: cdp = dp;
127: }
128: }
129: fclose(dtab_fp);
130: }
131:
132: addent(listp, cp)
133: struct handler_s **listp;
134: char *cp;
135: {
136: struct handler_s *el;
137: struct handler_s *sp;
138:
139: el = malloc(sizeof *el);
140: el->s_str = cp;
141: el->s_next = NULL;
142: if (*listp == NULL)
143: *listp = el;
144: else {
145: for (sp = *listp; sp->s_next != NULL; sp = sp->s_next)
146: ;
147: sp->s_next = el;
148: }
149: }
150:
151: inlist(list, str)
152: register struct handler_s *list;
153: register char *str;
154: {
155: for (; list != NULL; list = list->s_next)
156: if (strcmp(list->s_str, str) == 0)
157: return 1;
158: return 0;
159: }
Defined functions
otoi
defined in line
15; used 4 times
Defined variables
line
defined in line
11; used 4 times
Defined macros