1 /* 2 * Copyright 1987, 1988 by MIT Student Information Processing Board 3 * 4 * For copyright information, see copyright.h. 5 */ 6 7 #include <string.h> 8 #include "copyright.h" 9 #include "ss_internal.h" /* includes stdio and string */ 10 11 extern FILE *output_file; 12 13 char *gensym(), *str_concat3(), *quote(); 14 extern long gensym_n; 15 16 void write_ct(hdr, rql) 17 char const *hdr, *rql; 18 { 19 char *sym; 20 sym = gensym("ssu"); 21 fputs("static ss_request_entry ", output_file); 22 fputs(sym, output_file); 23 fputs("[] = {\n", output_file); 24 fputs(rql, output_file); 25 fputs(" { 0, 0, 0, 0 }\n", output_file); 26 fputs("};\n\nss_request_table ", output_file); 27 fputs(hdr, output_file); 28 fprintf(output_file, " = { %d, ", SS_RQT_TBL_V2); 29 fputs(sym, output_file); 30 fputs(" };\n", output_file); 31 } 32 33 char * generate_cmds_string(cmds) 34 char const *cmds; 35 { 36 char * var_name = gensym("ssu"); 37 fputs("static char const * const ", output_file); 38 fputs(var_name, output_file); 39 fputs("[] = {\n", output_file); 40 fputs(cmds, output_file); 41 fputs(",\n (char const *)0\n};\n", output_file); 42 return(var_name); 43 } 44 45 void generate_function_definition(func) 46 char const *func; 47 { 48 fputs("extern void ", output_file); 49 fputs(func, output_file); 50 fputs(" __SS_PROTO;\n", output_file); 51 } 52 53 char * generate_rqte(func_name, info_string, cmds, options) 54 char const *func_name; 55 char const *info_string; 56 char const *cmds; 57 int options; 58 { 59 int size; 60 char *string, *var_name, numbuf[16]; 61 var_name = generate_cmds_string(cmds); 62 generate_function_definition(func_name); 63 size = 6; /* " { " */ 64 size += strlen(var_name)+8; /* "quux, " */ 65 size += strlen(func_name)+8; /* "foo, " */ 66 size += strlen(info_string)+8; /* "\"Info!\", " */ 67 sprintf(numbuf, "%d", options); 68 size += strlen(numbuf)+5; /* " }," + NL + NUL */ 69 string = malloc(size); 70 strcpy(string, " { "); 71 strcat(string, var_name); 72 strcat(string, ",\n "); 73 strcat(string, func_name); 74 strcat(string, ",\n "); 75 strcat(string, info_string); 76 strcat(string, ",\n "); 77 strcat(string, numbuf); 78 strcat(string, " },\n"); 79 return(string); 80 } 81 82 char * 83 gensym(name) 84 char *name; 85 { 86 char *symbol; 87 88 symbol = malloc((strlen(name)+6) * sizeof(char)); 89 gensym_n++; 90 sprintf(symbol, "%s%05ld", name, gensym_n); 91 return(symbol); 92 } 93 94 /* concatenate three strings and return the result */ 95 char *str_concat3(a, b, c) 96 register char *a, *b, *c; 97 { 98 char *result; 99 int size_a = strlen(a); 100 int size_b = strlen(b); 101 int size_c = strlen(c); 102 103 result = malloc((size_a + size_b + size_c + 2)*sizeof(char)); 104 strcpy(result, a); 105 strcpy(&result[size_a], c); 106 strcpy(&result[size_a+size_c], b); 107 return(result); 108 } 109 110 /* return copy of string enclosed in double-quotes */ 111 char *quote(string) 112 register char *string; 113 { 114 register char *result; 115 int len; 116 len = strlen(string)+1; 117 result = malloc(len+2); 118 result[0] = '"'; 119 strncpy(&result[1], string, len-1); 120 result[len] = '"'; 121 result[len+1] = '\0'; 122 return(result); 123 } 124 125 #ifndef HAVE_STRDUP 126 /* make duplicate of string and return pointer */ 127 char *strdup(s) 128 register char *s; 129 { 130 register int len = strlen(s) + 1; 131 register char *new; 132 new = malloc(len); 133 strncpy(new, s, len); 134 return(new); 135 } 136 #endif 137