1: #ifndef lint
   2: static char sccsid[] = "@(#)main.c	4.1 (Berkeley) 7/3/83";
   3: #endif
   4: 
   5: #include "Courier.h"
   6: #include <errno.h>
   7: 
   8: char *input_file;
   9: char hfile[MAXSTR], cfile1[MAXSTR], cfile2[MAXSTR];
  10: char ufile[MAXSTR], sfile[MAXSTR];
  11: FILE *hf, *cf1, *cf2, *uf, *sf;
  12: list Values, Types;
  13: int errs;
  14: int explicit = 0;   /* if true, generate stubs with explicit bindings */
  15: 
  16: /*
  17:  * Predefined types.
  18:  */
  19: struct object
  20:     *Boolean_type,
  21:     *Cardinal_type, *LongCardinal_type,
  22:     *Integer_type, *LongInteger_type,
  23:     *String_type,
  24:     *Unspecified_type, *LongUnspecified_type;
  25: 
  26: struct object
  27:     *Undefined_constant;
  28: 
  29: main(argc, argv)
  30:     int argc;
  31:     char **argv;
  32: {
  33:     argc--; argv++;
  34:     if (argc == 2 && strcmp(*argv, "-x") == 0) {
  35:         explicit = 1; argc--; argv++;
  36:     }
  37:     if (argc != 1) {
  38:         fprintf(stderr, "Usage: courier [-x] input_file\n");
  39:         exit(1);
  40:     }
  41:     input_file = *argv;
  42:     if (freopen(input_file, "r", stdin) == NULL) {
  43:         perror(input_file); exit(1);
  44:     }
  45:     tempname(hfile); tempname(ufile); tempname(sfile);
  46:     tempname(cfile1); tempname(cfile2);
  47:     if ((hf = fopen(hfile, "w")) == NULL) {
  48:         perror(hfile); goto bad;
  49:     }
  50:     if ((uf = fopen(ufile, "w")) == NULL) {
  51:         perror(ufile); goto bad;
  52:     }
  53:     if ((sf = fopen(sfile, "w")) == NULL) {
  54:         perror(sfile); goto bad;
  55:     }
  56:     if ((cf1 = fopen(cfile1, "w")) == NULL) {
  57:         perror(cfile1); goto bad;
  58:     }
  59:     if ((cf2 = fopen(cfile2, "w")) == NULL) {
  60:         perror(cfile2); goto bad;
  61:     }
  62:     setup_predefs();
  63:     (void) yyparse();
  64:     fclose(hf); fclose(uf); fclose(sf);
  65:     if (errs == 0) {
  66:         int c;
  67: 
  68:         freopen(cfile2, "r", cf2);
  69:         while ((c = getc(cf2)) != EOF)
  70:             putc(c, cf1);
  71:         fclose(cf1); fclose(cf2);
  72:         unlink(cfile2);
  73:         rename(cfile1, program_name, "_stubs.c", 0);
  74:         rename(ufile, program_name, "_client.c", 0);
  75:         rename(sfile, program_name, "_server.c", 0);
  76:         rename(hfile, program_name, ".h", 1);
  77:         exit(0);
  78:     }
  79:     fclose(cf1); fclose(cf2);
  80: bad:
  81:     unlink(hfile);
  82:     unlink(ufile);
  83:     unlink(sfile);
  84:     unlink(cfile1);
  85:     unlink(cfile2);
  86:     exit(1);
  87: }
  88: 
  89: /*
  90:  * Rename the source file to be <dest>.<suffix> .
  91:  * If we're being paranoid, we prepend # to existing files that might
  92:  * get clobbered.
  93:  */
  94: rename(source, dest, suffix, paranoid)
  95:     char *source, *dest, *suffix;
  96:     int paranoid;
  97: {
  98:     char newname[MAXSTR], backup[MAXSTR];
  99:     extern int errno;
 100: 
 101:     sprintf(newname, "%s%s", dest, suffix);
 102:     for (;;)
 103:         if (link(source, newname) == 0)
 104:             if (unlink(source) != 0) {
 105:                 perror(newname);
 106:                 return (-1);
 107:             } else
 108:                 return (0);
 109:         else if (errno != EEXIST ||
 110:              (paranoid && rename(newname, "#", newname) != 0) ||
 111:              (! paranoid && unlink(newname) != 0))
 112:                 break;
 113:     perror(newname);
 114:     return (-1);
 115: }
 116: 
 117: /* VARARGS1 */
 118: yyerror(s, args)
 119:     char *s;
 120: {
 121:     extern int yylineno;
 122: 
 123:     errs = 1;
 124:     fprintf(stderr, "%d: ", yylineno);
 125:     _doprnt(s, &args, stderr);
 126:     putc('\n', stderr);
 127:     unlink(hfile); unlink(ufile); unlink(sfile);
 128:     unlink(cfile1); unlink(cfile2);
 129: }
 130: 
 131: tempname(buf)
 132:     char *buf;
 133: {
 134:     static int n = 0;
 135: 
 136:     sprintf(buf, "tmp%d.%d", n, getpid());
 137:     n++;
 138: }
 139: 
 140: /*
 141:  * This mess is needed because C doesn't handle initialization of unions.
 142:  */
 143: setup_predefs()
 144: {
 145:     struct object *t;
 146: 
 147:     Boolean_type = make(O_SYMBOL, "Boolean");
 148:     t = make(O_TYPE, C_PREDEF);
 149:     t->t_pfname = "PackBoolean";
 150:     t->t_ufname = "UnpackBoolean";
 151:     declare(&Values, Boolean_type, t);
 152: 
 153:     Cardinal_type = make(O_SYMBOL, "Cardinal");
 154:     t = make(O_TYPE, C_PREDEF);
 155:     t->t_pfname = "PackCardinal";
 156:     t->t_ufname = "UnpackCardinal";
 157:     declare(&Values, Cardinal_type, t);
 158: 
 159:     LongCardinal_type = make(O_SYMBOL, "LongCardinal");
 160:     t = make(O_TYPE, C_PREDEF);
 161:     t->t_pfname = "PackLongCardinal";
 162:     t->t_ufname = "Unpack_LongCardinal";
 163:     declare(&Values, LongCardinal_type, t);
 164: 
 165:     Integer_type = make(O_SYMBOL, "Integer");
 166:     t = make(O_TYPE, C_PREDEF);
 167:     t->t_pfname = "PackInteger";
 168:     t->t_ufname = "UnpackInteger";
 169:     declare(&Values, Integer_type, t);
 170: 
 171:     LongInteger_type = make(O_SYMBOL, "LongInteger");
 172:     t = make(O_TYPE, C_PREDEF);
 173:     t->t_pfname = "PackLongInteger";
 174:     t->t_ufname = "UnpackLongInteger";
 175:     declare(&Values, LongInteger_type, t);
 176: 
 177:     String_type = make(O_SYMBOL, "String");
 178:     t = make(O_TYPE, C_PREDEF);
 179:     t->t_pfname = "PackString";
 180:     t->t_ufname = "UnpackString";
 181:     declare(&Values, String_type, t);
 182: 
 183:     Unspecified_type = make(O_SYMBOL, "Unspecified");
 184:     t = make(O_TYPE, C_PREDEF);
 185:     t->t_pfname = "PackUnspecified";
 186:     t->t_ufname = "UnpackUnspecified";
 187:     declare(&Values, Unspecified_type, t);
 188: 
 189:     LongUnspecified_type = make(O_SYMBOL, "LongUnspecified");
 190:     t = make(O_TYPE, C_PREDEF);
 191:     t->t_pfname = "PackLongUnspecified";
 192:     t->t_ufname = "UnpackLongUnspecified";
 193:     declare(&Values, LongUnspecified_type, t);
 194: 
 195:     Undefined_constant = make(O_SYMBOL, "?undefined?");
 196:     declare(&Types, Undefined_constant, Unspecified_type);
 197:     declare(&Values, Undefined_constant, make(O_CONSTANT, 0));
 198: }

Defined functions

main defined in line 29; never used
rename defined in line 94; used 5 times
setup_predefs defined in line 143; used 1 times
  • in line 62
tempname defined in line 131; used 5 times

Defined variables

String_type defined in line 23; used 5 times
cfile1 defined in line 9; used 6 times
cfile2 defined in line 9; used 7 times
errs defined in line 13; used 2 times
hfile defined in line 9; used 6 times
input_file defined in line 8; used 3 times
sccsid defined in line 2; never used
sfile defined in line 10; used 6 times
ufile defined in line 10; used 6 times
Last modified: 1983-07-04
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1640
Valid CSS Valid XHTML 1.0 Strict