/* ucc --- compile a C program, Unix style */ /* flags for c1 */ int a_flag = FALSE; /* abort after errors */ int f_flag = FALSE; /* do not include =cdefs= */ int u_flag = FALSE; /* be more UNIX compatible */ int y_flag = FALSE; /* run "lint" */ int I_flag = FALSE; /* use the provided include directories */ int D_flag = FALSE; /* define variables */ /* flags for vcg */ int s_flag = FALSE; /* produce PMA in named file */ int b_flag = FALSE; /* produce object text in named file */ char *b_name = ""; /* object file name */ char *s_name = ""; /* PMA file name */ char *u_number = ""; /* optional number for c1's -u flag */ char *incls[MAXARGV]; /* list of include directories */ char *defs[MAXARGV]; /* list of defines */ int incl_index = 0; /* index into incls */ int def_index = 0; /* index into defs */ char *pass_on[MAXARGV]; /* stuff to pass on to 'compile' */ int p_index = 0; /* index into pass_on */ char *strrchr(); /* declare function */ main(argc, argv) int argc; char **argv; { int i; if (argc == 1) usage (); for (i = 1; i < argc; i++) switch (argv[i][0]) { case '-': switch (argv[i][1]) { case 'a': a_flag = TRUE; break; case 'b': b_flag = TRUE; if (argv[i][2] != '\0') b_name = & argv[i][2]; else if (i + 1 < argc && argv[i+1][0] != '-') { i++; b_name = argv[i]; } break; case 'f': f_flag = TRUE; break; case 's': s_flag = TRUE; if (argv[i][2] != '\0') s_name = & argv[i][2]; else if (i + 1 < argc && argv[i+1][0] != '-') { i++; s_name = argv[i]; } break; case 'u': u_flag = TRUE; if (argv[i][2] != '\0') u_number = & argv[i][2]; else if (i + 1 < argc && argv[i+1][0] != '-') { i++; u_number = argv[i]; } break; case 'y': y_flag = TRUE; break; case 'D': D_flag = TRUE; if (argv[i][2] != '\0') defs[def_index++] = & argv[i][2]; else if (i + 1 < argc && argv[i+1][0] != '-') { defs[def_index++] = argv[i+1]; i++; } else usage(); break; case 'I': I_flag = TRUE; if (argv[i][2] != '\0') incls[incl_index++] = & argv[i][2]; else if (i + 1 < argc && argv[i+1][0] != '-') { incls[incl_index++] = argv[i+1]; i++; } else usage(); break; default: pass_on[p_index++] = argv[i]; break; } break; default: pass_on[p_index++] = argv[i]; break; } shell_commands (); } /* shell_commmands --- write out shell commands to compile a program */ shell_commands() { int i; printf ("declare _search_rule = \"^int,^var,=bin=/&\"\n"); printf ("compile -m c "); if (a_flag || f_flag || y_flag || u_flag || s_flag || b_flag || I_flag || D_flag) { printf("-C '"); if (a_flag) printf ("-a "); if (f_flag) printf ("-f "); if (y_flag) printf ("-y "); if (u_flag) printf ("-u %s ", u_number); if (s_flag) printf ("-s %s ", s_name); if (b_flag) printf ("-b %s ", b_name); for (i = 0; i < def_index; i++) printf ("-D%s ", defs[i]); for (i = 0; i < incl_index; i++) printf ("-I %s ", incls[i]); printf ("' "); } for (i = 0; i < p_index; i++) printf ("'%s' ", pass_on[i]); printf ("\n"); } /* usage --- print Usage message and exit */ usage() { fprintf (stderr, "Usage: ucc { }\n"); fprintf (stderr, " [][]\n"); exit (1); }