1: /*
2: * SYSGEN -- an imitation of the CONFIG command of VMS SYSGEN.
3: *
4: * $Id: sysgen.c,v 1.9 1997/06/08 12:12:59 tih Exp $
5: */
6:
7: #include <stdio.h>
8: #include <unistd.h>
9: #include <string.h>
10: #include <ctype.h>
11:
12: #include "devices.h"
13:
14: struct userdev {
15: char username[DEVNAMLEN];
16: char name[DEVNAMLEN];
17: int vector;
18: long csr;
19: };
20:
21: struct userdev usertab[MAXDEVS];
22:
23: #define roundup(value,align) (value+align-1-((value+align-1)%align))
24:
25: int main(argc, argv)
26: int argc;
27: char **argv;
28: {
29: int i, j, k, n;
30: int vecbase = VECBASE;
31: long csrbase = CSRBASE;
32: char userdev[DEVNAMLEN];
33: char useralias[DEVNAMLEN];
34: int userdevs = 0;
35: char inputline[BUFSIZ];
36: char scanformat[32];
37:
38: if (isatty(fileno(stdin))) {
39: fprintf(stderr, "Type device names one per line, optionally followed\n");
40: fprintf(stderr, "by a comma and a repeat count. Finish with EOF.\n");
41: }
42:
43: sprintf(scanformat, "%%%d[A-Za-z0-9],%%d", DEVNAMLEN - 1);
44: while (fgets(inputline, BUFSIZ, stdin)) {
45: for (i = 0; i < strlen(inputline); i++)
46: if (inputline[i] == '\n')
47: inputline[i] = '\0';
48: else if (islower(inputline[i]))
49: inputline[i] = toupper(inputline[i]);
50: n = sscanf(inputline, scanformat, userdev, &k);
51: if (n == 0)
52: continue;
53: if (n == 1)
54: k = 1;
55: strcpy(useralias, userdev);
56: for (i = 0; i < ALIASTABLEN; i++)
57: if (!strcmp(aliastab[i].alias, userdev))
58: strcpy(useralias, aliastab[i].name);
59: for (i = 0; i < DEVTABLEN; i++)
60: if (!strcmp(devtab[i].name, useralias))
61: break;
62: if (i >= DEVTABLEN) {
63: fprintf(stderr, "sysgen: %s: unrecognized device name; ignored\n",
64: useralias);
65: continue;
66: }
67: while (k--) {
68: usertab[userdevs].vector = 0;
69: usertab[userdevs].csr = 0;
70: strcpy(usertab[userdevs].username, userdev);
71: strcpy(usertab[userdevs++].name, useralias);
72: }
73: }
74:
75: for (i = 0; i < DEVTABLEN; i++) {
76: if (devtab[i].csr == FLOAT)
77: csrbase = roundup(csrbase + CSRLEN, devtab[i].csralign);
78: for (j = 0; j < userdevs; j++) {
79: if ((!strcmp(devtab[i].name, usertab[j].name)) &&
80: (usertab[j].csr == 0)) {
81: if ((devtab[i].vector == FLOAT) && (devtab[i].csr == FLOAT)) {
82: vecbase = roundup(vecbase, devtab[i].vecalign);
83: usertab[j].vector = vecbase;
84: vecbase = vecbase + devtab[i].numvecs * VECLEN;
85: usertab[j].csr = csrbase;
86: csrbase = roundup(csrbase + devtab[i].csralign, devtab[i].csralign);
87: continue;
88: }
89: if (devtab[i].vector == FLOAT) {
90: vecbase = roundup(vecbase, devtab[i].vecalign);
91: usertab[j].vector = vecbase;
92: vecbase = vecbase + devtab[i].numvecs * VECLEN;
93: } else {
94: usertab[j].vector = devtab[i].vector;
95: }
96: if (devtab[i].csr == FLOAT) {
97: usertab[j].csr = csrbase;
98: } else {
99: usertab[j].csr = devtab[i].csr;
100: }
101: break;
102: }
103: }
104: }
105:
106: for (i = 0; i < userdevs; i++) {
107: if (usertab[i].csr == 0)
108: fprintf(stderr, "sysgen: %s: too many units; ignored\n",
109: usertab[i].username);
110: }
111:
112: printf("Table of standard DEC assignments for configuration:\n\n");
113:
114: printf(" DEVICE CSR VECTOR\n-------------------------\n");
115: for (i = 0; i < userdevs; i++) {
116: if (usertab[i].csr == 0)
117: continue;
118: printf("%8s %06lo%c %04o%c\n",
119: usertab[i].username,
120: usertab[i].csr, (usertab[i].csr < 0764000) ? '*' : ' ',
121: usertab[i].vector, (usertab[i].vector < 0300) ? ' ' : '*');
122: }
123: printf("\nCSRs and vectors marked '*' are in floating space.\n");
124:
125: return 0;
126: }
127:
128: /*
129: * eof
130: */
Defined functions
main
defined in line
25;
never used
Defined variables
Defined struct's
Defined macros