static int merge_hwe (struct hwentry * dst, struct hwentry * src) { merge_str(vendor); merge_str(product); merge_str(revision); merge_str(uid_attribute); merge_str(features); merge_str(hwhandler); merge_str(selector); merge_str(checker_name); merge_str(prio_name); merge_str(prio_args); merge_str(alias_prefix); merge_str(bl_product); merge_num(pgpolicy); merge_num(pgfailback); merge_num(rr_weight); merge_num(no_path_retry); merge_num(minio); merge_num(minio_rq); merge_num(pg_timeout); merge_num(flush_on_last_del); merge_num(fast_io_fail); merge_num(dev_loss); merge_num(user_friendly_names); merge_num(retain_hwhandler); merge_num(detect_prio); /* * Make sure features is consistent with * no_path_retry */ if (dst->no_path_retry == NO_PATH_RETRY_FAIL) remove_feature(&dst->features, "queue_if_no_path"); else if (dst->no_path_retry != NO_PATH_RETRY_UNDEF) add_feature(&dst->features, "queue_if_no_path"); return 0; }
int main(int argc, char *argv[]) { boolean print_parse = FALSE; boolean print_expanded = FALSE; char *arg; char *source_name = NULL; char *output_name = NULL; FILE *file; add_header_handler("module", set_module); add_header_handler("library", set_library); add_header_handler(NULL, end_of_headers); init_sym_table(); init_feature(); init_info(); init_expand(); init_compile(); #ifdef MACOS add_feature(symbol("macos")); # ifndef SHLB argc = ccommand( &argv ); # endif #endif while ((arg = *++argv) != NULL) { if (arg[0] == '-') { switch (arg[1]) { case 'd': if (arg[2] == '\0') { print_parse = TRUE; print_expanded = TRUE; } else { char *ptr; for (ptr = arg+2; *ptr != '\0'; ptr++) { switch (*ptr) { case 'p': print_parse = TRUE; break; case 'e': print_expanded = TRUE; break; default: fprintf(stderr, "Invalid thing to print: ``%c''\n", *ptr); usage(); } } } break; case 'o': if (output_name != NULL) { fprintf(stderr, "-o can only be used once.\n"); usage(); } else if (arg[2] != '\0') output_name = arg+2; else if (*++argv == NULL) { fprintf(stderr, "-o must be followed by the output " "file name.\n"); usage(); } else output_name = *argv; break; case 'l': if (LibraryName != NULL) { fprintf(stderr, "-l can only be used once.\n"); usage(); } if (arg[2] != '\0') LibraryName = symbol(arg+2); else if (*++argv == NULL) { fprintf(stderr, "-l must be followed by the library " "name.\n"); usage(); } else LibraryName = symbol(*argv); break; case 'q': GiveWarnings = FALSE; break; case 'D': if (arg[2] != '\0') add_feature(symbol(arg + 2)); else if (*++argv == NULL) { fprintf(stderr, "-D must be followed by the feature to define.\n"); usage(); } else add_feature(symbol(*argv)); break; case 'U': if (arg[2] != '\0') remove_feature(symbol(arg + 2)); else if (*++argv == NULL) { fprintf(stderr, "-U must be followed by the feature " "to undefine.\n"); usage(); } else remove_feature(symbol(*argv)); break; default: fprintf(stderr, "Invalid flag: ``%s''\n", arg); usage(); } } else if (source_name != NULL) { fprintf(stderr, "Too many files\n"); usage(); } else source_name = arg; } if (source_name == NULL) usage(); yyin = fopen(source_name, "rb"); if (yyin == NULL) { /* Try the same filename but in the current directory */ /* Start ptr at the null termination, and work backwards to a path separator. */ char *ptr = source_name + strlen(source_name); for ( ; ptr != source_name; ptr--) { if (*ptr == '/' || *ptr == '\\') { /* We're pointing at the path separator, which is too far */ ptr++; break; } } /* If ptr is a different string than source_name, and it isn't the empty string... */ if (ptr != source_name && *ptr != 0) { yyin = fopen(ptr, "rb"); } if (yyin == NULL) { perror(source_name); exit(1); } } current_file = source_name; yyparse(); if (print_parse) { printf("================ Original Parse Tree ================\n"); print_body(Program, 0); } if (nerrors != 0) exit(1); /* Do the various source-to-source expansions. */ expand(Program); if (print_expanded) { printf("================ Expanded Parse Tree ================\n"); print_body(Program, 0); } if (nerrors != 0) exit(1); /* Run environment analysis */ environment_analysis(Program); if (nerrors != 0) exit(1); if (output_name == NULL) output_name = make_output_name(source_name, ".dbc"); if (strcmp(output_name, "-") == 0) file = stdout; else file = fopen(output_name, "wb"); if (file == NULL) { perror(output_name); exit(1); } dump_setup_output(source_name, file); /* Generate code. */ compile(Program); dump_finalize_output(); fclose(file); exit(0); return 0; }