/** * \brief Process compiler options. * \param argc The number of input parameters. * \param argv The input parameter strings. * \return Indicates if processing was successful. * 0 = processing successful * 1 = processing not successful * * Processes the input options passed to the compiler * and fill the compiler options structure as appropriate. * * The following options are supported: * -h: print help * -p: print the IR to a file * -t: test modus, only success/failure log * -o: the output file name (different from 'input'.o) */ int process_options(int argc, char *argv[]) { int opt; int ret = 0; /* add a handler to resource manager to free resources * in the case of an error during option processing */ rm_register_handler(&resource_mgr, free_options, NULL); while ((opt = getopt(argc, argv, "hpto:")) != -1) { switch (opt) { case 'p': cc_options.print_ir = 1; break; case 't': /* fewer logs, for automated testing */ cc_options.print_only_errors = 1; break; case 'o': /* output file */ cc_options.output_file = strdup(optarg); if (cc_options.output_file == NULL) { fatal_os_error(OUT_OF_MEMORY, 1, __FILE__, __LINE__, ""); return 1; } break; case 'h': /* print help */ print_usage(argv[0]); rm_cleanup_resources(&resource_mgr); exit(EXIT_SUCCESS); default: /* '?' */ /* print usage */ fprintf(stderr, "ERROR: unknown parameter: %s\n", argv[optind]); print_usage(argv[0]); return 1; } } if (optind >= argc) { fprintf(stderr, "ERROR: missing input file\n"); print_usage(argv[0]); ret = 1; } else if (optind < argc - 1) { fprintf(stderr, "ERROR: too many input files\n"); print_usage(argv[0]); ret = 1; } else { cc_options.input_file = strdup(argv[optind]); if (cc_options.input_file == NULL) { fatal_os_error(OUT_OF_MEMORY, 1, __FILE__, __LINE__, ""); return 1; } char *filebase = get_file_basename(cc_options.input_file); ; if (filebase == NULL) { return 1; } if (!has_file_extension(cc_options.input_file, C_EXT)) { fprintf(stderr, "ERROR: no C file (.c) as input\n"); ret = 1; } else { /* The file name has a valid .c extension */ if (cc_options.output_file == NULL) { /* create output file name <input>.o */ cc_options.output_file = get_filename_with_ext(filebase, OUTPUT_EXT); if (cc_options.output_file == NULL) { ret = 1; } } if (cc_options.print_ir == 1) { /* create IR file name <input>.ir */ cc_options.ir_file = get_filename_with_ext(filebase, IR_EXT); if (cc_options.ir_file == NULL) { ret = 1; } } } free(filebase); } return ret; }
/** * \brief Initialize the resource manager. * \param mgr The memory area to be initialized. */ void rm_init (resource_mgr_t *mgr) { mgr->num_entries = 0; mgr->entries = NULL; rm_register_handler(mgr, rm_cleanup, mgr); }