1 /* 2 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5 6 /* 7 * make_commands.c 8 * 9 * util/ss/mk_cmds.c 10 * 11 * Copyright 1987, 1988 by MIT Student Information Processing Board 12 * 13 * For copyright information, see copyright.h. 14 */ 15 16 #include "copyright.h" 17 #include <stdio.h> 18 #include <sys/param.h> 19 #include <sys/types.h> 20 #include <sys/file.h> 21 #include <string.h> 22 #include "ss_internal.h" 23 24 static const char copyright[] = 25 "Copyright 1987 by MIT Student Information Processing Board"; 26 27 extern pointer malloc (unsigned); 28 extern char *last_token; 29 extern FILE *output_file; 30 31 extern FILE *yyin, *yyout; 32 #ifndef NO_YYLINENO 33 extern int yylineno; 34 #endif 35 36 int main(argc, argv) 37 int argc; 38 char **argv; 39 { 40 char c_file[MAXPATHLEN]; 41 int result; 42 char *path, *p, *q; 43 44 if (argc != 2) { 45 fputs("Usage: ", stderr); 46 fputs(argv[0], stderr); 47 fputs("cmdtbl.ct\n", stderr); 48 exit(1); 49 } 50 51 path = malloc(strlen(argv[1])+4); /* extra space to add ".ct" */ 52 strcpy(path, argv[1]); 53 p = strrchr(path, '/'); 54 if (p == (char *)NULL) 55 p = path; 56 else 57 p++; 58 p = strrchr(p, '.'); 59 if (p == (char *)NULL || strcmp(p, ".ct")) 60 strcat(path, ".ct"); 61 yyin = fopen(path, "rF"); 62 if (!yyin) { 63 perror(path); 64 exit(1); 65 } 66 67 p = strrchr(path, '.'); 68 *p = '\0'; 69 q = rindex(path, '/'); 70 strncpy(c_file, (q) ? q + 1 : path, sizeof(c_file) - 1); 71 c_file[sizeof(c_file) - 1] = '\0'; 72 strncat(c_file, ".c", sizeof(c_file) - 1 - strlen(c_file)); 73 *p = '.'; 74 75 output_file = fopen(c_file, "w+F"); 76 if (!output_file) { 77 perror(c_file); 78 exit(1); 79 } 80 81 fputs("/* ", output_file); 82 fputs(c_file, output_file); 83 fputs(" - automatically generated from ", output_file); 84 fputs(path, output_file); 85 fputs(" */\n", output_file); 86 fputs("#include <ss/ss.h>\n\n", output_file); 87 fputs("#ifndef __STDC__\n#define const\n#endif\n\n", output_file); 88 /* parse it */ 89 result = yyparse(); 90 /* put file descriptors back where they belong */ 91 fclose(yyin); /* bye bye input file */ 92 fclose(output_file); /* bye bye output file */ 93 94 return result; 95 } 96 97 yyerror(s) 98 char *s; 99 { 100 fputs(s, stderr); 101 #ifdef NO_YYLINENO 102 fprintf(stderr, "\nLast token was '%s'\n", last_token); 103 #else 104 fprintf(stderr, "\nLine %d; last token was '%s'\n", 105 yylineno, last_token); 106 #endif 107 } 108