|
|
1.1 root 1: /* Copyright (c) Bureau d'Etudes Ciaran O'Donnell,1987,1990,1991 */
2: /*
3: * mkscall.c - to make sys-call interface routine
4: * usage : mkscall name number nargs [-r rel-num]
5: * mkscall -f file
6: */
7: #include <stdio.h>
8: #include <ctype.h>
9:
10: char *usage = "usage: mkscall name number nargs [flags] [-r rel]\n";
11:
12: struct _args {
13:
14: char *a_name; /* function name */
15: short a_num; /* system call number */
16: short a_arg; /* arg-count */
17: short a_flag; /* various flags - FLAG0 -> rval in d1. */
18: /* FLAG1 -> arg = *arg */
19: char *a_rel; /* ident string */
20: };
21:
22: #define FLAG0 0x01
23: #define FLAG1 0x02
24:
25: main(argc, argv)
26: register argc;
27: register char *argv[];
28: {
29:
30: struct _args args;
31: register char *fname = 0; /* input file for arg list */
32:
33: if(argc < 4){
34:
35: if(argc == 3 && argv[1][0] == '-' && argv[1][1] == 'f') {
36: fname = argv[2];
37: }
38: else {
39: fprintf(stderr,usage);
40: exit(1);
41: }
42: }
43:
44:
45: if(fname == (char *)0) {
46:
47: args.a_name = argv[1];
48: args.a_num = atoi(argv[2]);
49: args.a_arg = atoi(argv[3]);
50:
51: if(argc > 4) {
52: args.a_flag = atoi(argv[4]);
53: }
54:
55: mk_func(&args);
56:
57:
58: } else {
59:
60: register FILE *ffd;
61: register lcount;
62: register st;
63:
64: if((ffd = fopen(fname, "r")) == NULL) {
65:
66: fprintf(stderr, "mkscall: can't open %s\n", fname);
67: exit(2);
68: }
69:
70: for(lcount = 1; st = getargs(ffd, &args); lcount++) {
71:
72: if(st == -1)
73: fprintf(stderr,
74: "mkscall: file %s, line %d discarded\n",
75: fname, lcount);
76:
77: else
78: mk_func(&args);
79: }
80: }
81:
82: exit(0);
83: }
84:
85:
86: /*
87: * make system call routine.
88: */
89:
90:
91: mk_func(arg)
92: register struct _args *arg;
93: {
94:
95: register FILE *fd;
96: register count;
97: char file[20];
98: register flag;
99:
100: flag = arg->a_flag;
101:
102: if(arg->a_arg > 6) {
103: fprintf(stderr, "mkscall: func %s, too much args\n",
104: arg->a_name);
105: return(-1);
106: }
107:
108: /* check arg count for flag = FLAG1 (arg = *arg) */
109: if((flag & FLAG1) && (arg->a_arg > 1)) {
110:
111: fprintf(stderr,
112: "mkscall: func %s, only one arg allowed with flag 0x%02x.\n",
113: arg->a_name, flag & FLAG1);
114: return(-1);
115: }
116:
117: strcpy(file, arg->a_name);
118: strcat(file, ".s");
119:
120: if((fd = fopen(file, "w")) == NULL) {
121:
122: fprintf(stderr, "mkscall: can't create %s\n", file);
123: return(-1);
124: }
125:
126:
127: fprintf(fd, "/ C library - %s\n", arg->a_name);
128:
129: fprintf(fd,"\n .globl %s", arg->a_name);
130: fprintf(fd,"\n .globl .cerror");
131:
132: fprintf(fd,"\n\n%s:\n", arg->a_name);
133:
134: if(flag & FLAG1) { /* arg must be *arg */
135:
136: fprintf(fd," movl 4(%%esp),%%edx\n");
137: fprintf(fd," movl (%%edx),%%edx\n");
138: fprintf(fd," movl %%edx,4(%%esp)\n");
139: }
140:
141: /* put system-call number in d0 */
142: fprintf(fd, " movl $%d,%%eax\n", arg->a_num);
143: fprintf(fd, " lcall $0x7,$0\n");
144: fprintf(fd," jc .cerror\n");
145:
146: if(flag & FLAG0) { /* rval in d1 */
147:
148: fprintf(fd, "\n movl %%edx,%%eax\n");
149: }
150:
151: fprintf(fd," ret\n");
152: fflush(fd);
153: fclose(fd);
154:
155: return(0);
156: }
157:
158: /*
159: * get a line from input file and cracks args.
160: */
161:
162: #define BFS 20
163: char bfnam[BFS];
164:
165: getargs(fd, arg)
166: register FILE *fd;
167: register struct _args *arg;
168: {
169: register char buff[80];
170:
171: arg->a_name = NULL;
172: arg->a_num = arg->a_arg = arg->a_flag = 0;
173:
174: more : if(fgets(buff, 80, fd) == NULL) {
175:
176: return(0);
177: }
178:
179: else {
180:
181: char *get_word();
182: register char *w;
183:
184:
185: if(*buff == '#') {
186: goto more; /* skip comment line */
187: }
188:
189: if(w = get_word(buff)) {
190: strncpy(bfnam, w, BFS-1);
191: arg->a_name = bfnam; /* get func name */
192: }
193: else
194: goto error;
195:
196: if(w = get_word(w + strlen(w) + 1))
197: arg->a_num = atoi(w); /* get sys-call number */
198: else
199: goto error;
200:
201: if(w = get_word(w + strlen(w) + 1))
202: arg->a_arg = atoi(w); /* get arg count */
203: else
204: goto error;
205:
206: if(w = get_word(w + strlen(w) + 1))
207: arg->a_flag = atoi(w); /* get flags */
208:
209:
210: return(1);
211: }
212:
213: error :
214: return(-1);
215: }
216:
217:
218: /*
219: * get next string from buff and terminate it by a null.
220: */
221:
222: char *
223: get_word(buff)
224: register char *buff;
225: {
226: register char *w = (char *)0;
227: register c;
228:
229: while((c = *buff)) {
230:
231: if(c == '#') /* rest of the line is comment */
232: break;
233:
234: if(isspace(c)) {
235:
236: if(w)
237: {
238: *buff = '\0';
239: break;
240: }
241:
242: } else if(!w)
243: w = buff;
244:
245: buff++;
246: }
247:
248: return(w);
249: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.