/* * Copyright (c) 1999 * Steven G. Kargl. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * This software is provided by Steven G. Kargl and contributors ``as is'' and * any express or implied warranties, including, but not limited to, the implied * warranties of merchantability and fitness for a particular purpose are * disclaimed. In no event shall Steven G. Kargl or contributors be liable for * any direct, indirect, incidental, special, exemplary, or consequential * damages (including, but not limited to, procurement of substitute goods or * services; loss of use, data, or profits; or business interruption) however * caused and on any theory of liability, whether in contract, strict liability, * or tort (including negligence or otherwise) arising in any way out of the * use of this software, even if advised of the possibility of such damage. */ #include #include #include #include "f77.h" #include "proto.h" void cmds(int ac, char **av) { extern flags_t flags; extern int index_f2c_cmd, index_cc_cmd, index_files; extern int index_pp_cmd; extern int index_libdirs, index_libs; extern char **f2c_cmd, **cc_cmd, **files, **libs, **libdirs; extern char **pp_cmd; extern char *output_name, *tmpdir; char **ov; int len; ov = av; /* Remove f77 from argument list */ ac--; ov++; while(ac--) { if (*ov[0] == '-') { /* It's an option */ if (strlen(*ov) == 2) { switch ((*ov)[1]) { case '1': if (!(flags & ONETRIP)) { f2c_cmd[index_f2c_cmd++] = mkstring("-onetrip"); flags |= ONETRIP; } break; case 'C': if (!(flags & BOUNDS_CHECK)) { f2c_cmd[index_f2c_cmd++] = *ov; flags |= BOUNDS_CHECK; } break; case 'c': flags |= COMPILE_ONLY; break; case 'E': flags |= PREPROCESS_ONLY; break; case 'f': if (flags & COLUMNS_72) { fputs("f77: cmds: conflicting options: ", stderr); fputs("-f and -72\n", stderr); exit(1); } if (!(flags & FREE_FORM)) { f2c_cmd[index_f2c_cmd++] = *ov; #ifdef SUN_FPP pp_cmd[index_pp_cmd++] = mkstring("-free"); #endif flags |= FREE_FORM; } break; case 'h': if (!(flags & F66_HOLLERITH)) { f2c_cmd[index_f2c_cmd++] = *ov; flags |= F66_HOLLERITH; } break; case 'o': if (output_name) free(output_name); output_name = *++ov; ac--; break; case 'R': if (!(flags & NO_PROMOTE_REAL)) { f2c_cmd[index_f2c_cmd++] = *ov; flags |= NO_PROMOTE_REAL; } break; case 'r': if (!(flags & REAL_FUNCS)) { f2c_cmd[index_f2c_cmd++] = *ov; flags |= REAL_FUNCS; } break; case 'T': if (tmpdir) free(tmpdir); tmpdir = *++ov; ac--; break; case 'V': flags |= ECHO; break; case 'v': if (!(flags & VERBOSE)) { f2c_cmd[index_f2c_cmd++] = *ov; cc_cmd[index_cc_cmd++] = *ov; flags |= VERBOSE; } break; case 'w': if (!(flags & NO_WARNINGS)) { f2c_cmd[index_f2c_cmd++] = *ov; #ifdef SUN_FPP pp_cmd[index_pp_cmd++] = *ov; #endif flags |= NO_WARNINGS; } break; case 'z': if (!(flags & NO_DBLE_CMPLX)) { f2c_cmd[index_f2c_cmd++] = *ov; flags |= NO_DBLE_CMPLX; } break; default: cc_cmd[index_cc_cmd++] = *ov; } /* End of Switch */ } else if (strcmp(*ov, "-cd") == 0) { if (!(flags & IGNORE_CD_FUNCS)) { f2c_cmd[index_f2c_cmd++] = *ov; flags |= IGNORE_CD_FUNCS; } } else if (strlen(*ov) > 2 && (*ov)[1] == 'D') { pp_cmd[index_pp_cmd++] = *ov; } else if (strcmp(*ov, "-ext") == 0) { if (!(flags & STRICT_F77)) { f2c_cmd[index_f2c_cmd++] = *ov; flags |= STRICT_F77; } } else if (strcmp(*ov, "-72") == 0) { if (flags & FREE_FORM) { fputs("f77: cmds: conflicting options: ", stderr); fputs("-f and -72\n", stderr); exit(1); } if (!(flags & COLUMNS_72)) { f2c_cmd[index_f2c_cmd++] = *ov; #ifdef SUN_FPP pp_cmd[index_pp_cmd++] = mkstring("-fixed"); #endif flags |= COLUMNS_72; } } else if (strcmp(*ov, "-hd") == 0) { if (!(flags & F66_HOLLERITH)) { f2c_cmd[index_f2c_cmd++] = *ov; flags |= F66_HOLLERITH; } } else if (strcmp(*ov, "-I2") == 0) { if (!(flags & SHORT_INTEGER)) { f2c_cmd[index_f2c_cmd++] = *ov; flags |= SHORT_INTEGER; } } else if (strncmp(*ov, "-I", 2) == 0) { pp_cmd[index_pp_cmd++] = *ov; } else if (strcmp(*ov, "-i90") == 0) { if (!(flags & IGNORE_F90_BITS)) { f2c_cmd[index_f2c_cmd++] = *ov; flags |= IGNORE_F90_BITS; } } else if (strcmp(*ov, "-kr") == 0 || strcmp(*ov, "-krd") == 0) { if (!(flags & F77_TEMPORARY)) { f2c_cmd[index_f2c_cmd++] = *ov; flags |= F77_TEMPORARY; } } else if (strncmp(*ov, "-L", 2) == 0) { libdirs[index_libdirs++] = *ov; } else if (strncmp(*ov, "-l", 2) == 0) { libs[index_libs++] = *ov; #ifdef SUN_FPP } else if (strncmp(*ov, "-macro=", 7) == 0) { if (!(flags & SUN_FPP_MACROS)) { pp_cmd[index_pp_cmd++] = *ov; flags |= SUN_FPP_MACROS; } #endif } else if (strcmp(*ov, "-onetrip") == 0) { if (!(flags & ONETRIP)) { f2c_cmd[index_f2c_cmd++] = *ov; flags |= ONETRIP; } } else if (strcmp(*ov, "-r8") == 0) { if (!(flags & PROMOTE_REAL2DP)) { f2c_cmd[index_f2c_cmd++] = *ov; flags |= PROMOTE_REAL2DP; } } else if (strlen(*ov) > 2 && (*ov)[1] == 'U') { pp_cmd[index_pp_cmd++] = *ov; } else if (strcmp(*ov, "-undef") == 0) { if (!(flags & SUN_FPP_UNDEF)) { pp_cmd[index_pp_cmd++] = *ov; flags |= SUN_FPP_UNDEF; } } else if (strcmp(*ov, "-w8") == 0) { if (!(flags & ALIGN_COMMON)) { f2c_cmd[index_f2c_cmd++] = *ov; flags |= ALIGN_COMMON; } #ifdef SUN_FPP } else if (strcmp(*ov, "-w0") == 0) { if (!(flags & SUN_FPP_NO_WARN)) { pp_cmd[index_pp_cmd++] = *ov; flags |= SUN_FPP_NO_WARN; } #endif } else if (strcmp(*ov, "-w66") == 0) { if (!(flags & SUPRESS_F66_WARN)) { f2c_cmd[index_f2c_cmd++] = *ov; flags |= SUPRESS_F66_WARN; } } else /* Pass through to gcc */ cc_cmd[index_cc_cmd++] = *ov; } else { /* We have a file */ len = strlen(*ov); if ((*ov)[len - 2] == '.') { switch((*ov)[len - 1]) { case 'F': case 'f': case 'o': case 'a': files[index_files++] = *ov; break; default: fputs("f77: cmds: unrecognized file: ", stderr); fprintf(stderr, "%s\n", *ov); exit(1); } } else { fputs("f77: cmds: unrecognized file: ", stderr); fprintf(stderr, "%s\n", *ov); exit(1); } } ov++; } /* End while */ } void print_cmd(int n, char **cmd) { char **av; av = cmd; while (n--) printf("%s ", *av++); printf("\n"); }