void cook_search_list(const opcode_context_ty *ocp, string_list_ty *slp) { string_ty *s; id_ty *idp; /* * make sure the variable exists */ trace(("cook_search_list()\n{\n")); idp = opcode_context_id_search(ocp, id_search_list); if (!idp) { string_list_constructor(slp); s = str_from_c("."); string_list_append(slp, s); str_free(s); opcode_context_id_assign ( (opcode_context_ty *)ocp, id_search_list, id_variable_new(slp), 0 ); string_list_destructor(slp); } /* * extract its string value */ id_variable_query(idp, slp); /* * make sure the search list isn't empty * make sure the search list has "." as the first element */ if ( !slp->nstrings || slp->string[0]->str_length != 1 || slp->string[0]->str_text[0] != '.' ) { s = str_from_c("."); string_list_prepend(slp, s); str_free(s); opcode_context_id_assign ( (opcode_context_ty *)ocp, id_search_list, id_variable_new(slp), 0 ); } trace(("}\n")); }
static opcode_status_ty execute(const opcode_ty *op, opcode_context_ty *icp) { opcode_status_ty status; const opcode_setenv_append_ty *this; string_list_ty *name; string_list_ty *value; string_ty *s; char *tmp; trace(("opcode_setenv_append::execute()\n{\n")); status = opcode_status_success; this = (const opcode_setenv_append_ty *)op; value = opcode_context_string_list_pop(icp); name = opcode_context_string_list_pop(icp); switch (name->nstrings) { case 0: error_with_position ( &this->pos, 0, i18n("lefthand side of assignment is empty") ); status = opcode_status_error; break; case 1: /* * If the environment variable is already set, prepend * its existing value to the value list the user gave us. */ tmp = getenv(name->string[0]->str_text); if (tmp) { string_ty *tmp2; tmp2 = str_from_c(tmp); string_list_prepend(value, tmp2); str_free(tmp2); } s = wl2str(value, 0, value->nstrings, " "); env_set(name->string[0]->str_text, s->str_text); str_free(s); break; default: error_with_position ( &this->pos, 0, i18n("lefthand side of assignment is more than one word") ); status = opcode_status_error; break; } string_list_delete(name); string_list_delete(value); trace(("return %s;\n", opcode_status_name(status))); trace(("}\n")); return status; }
int parse_list_main (int argc, char *argv[], const ListDescriptionSet *list_sets, int num_sets, const PredefinedCondition *conditions) { int option; int result = 255; utils_remember_program_name (argv[0]); while ((option = getopt_long (argc, argv, "D:", parse_list_options, NULL)) != -1) { switch (option) { case OPTION_HELP: print_usage (stdout); printf ("%s", help_string); result = 0; goto exit_parse_list_main; case 'D': { const char *delimiter = strchr (optarg, '='); if (delimiter) { if (memchr (optarg, '$', delimiter - optarg)) { fprintf (stderr, ("%s: fatal: " "substitution name cannot contain dollar signs\n"), short_program_name); goto exit_parse_list_main; } string_list_add_from_buffer (&substitutions, optarg, delimiter - optarg); substitutions.last->association = utils_duplicate_string (delimiter + 1); } else { string_list_add (&substitutions, optarg); substitutions.last->association = utils_duplicate_string (""); } } break; default: fprintf (stderr, "Try `%s --help' for more information.\n", full_program_name); goto exit_parse_list_main; } } if (argc - optind == 3) { char *list_file_name = argv[optind]; char *h_file_name = argv[optind + 1]; char *c_file_name = argv[optind + 2]; FILE *list_file = open_file (list_file_name, 0); if (list_file) { char *line; const ListDescription *lists = NULL; int k; string_list_prepend (&list_files, list_file_name); list_files.first->file = list_file; list_files.first->line_number = 0; do line = read_line (); while (line && (! *line || *line == '#')); if (looking_at ("@mode", &line)) { const char *mode = parse_thing (IDENTIFIER, &line, "mode name"); if (mode) { for (k = 0; k < num_sets; k++) { if (strcmp (mode, list_sets[k].mode_name) == 0) { lists = list_sets[k].lists; break; } } if (!lists) print_error ("fatal: unknown mode `%s'", mode); } } else print_error ("fatal: `@mode' expected"); if (lists) { FILE *h_file = open_file (h_file_name, 1); if (h_file) { FILE *c_file = open_file (c_file_name, 1); if (c_file) { static const char *preamble = "/* This file is automatically generated by `%s'.\n" " * Do not modify it, edit `%s' instead.\n" " */\n"; int n; int h_file_name_length = strlen (h_file_name); fprintf (h_file, preamble, short_program_name, list_file_name); fprintf (c_file, preamble, short_program_name, list_file_name); for (k = h_file_name_length; k >= 1; k--) { if (h_file_name[k - 1] == DIRECTORY_SEPARATOR) break; } for (n = 0; k < h_file_name_length; k++) { if (isalnum (h_file_name[k])) h_file_name[n++] = toupper (h_file_name[k]); else if (h_file_name[k] == '.' || h_file_name[k] == '_' || h_file_name[k] == '-') h_file_name[n++] = '_'; } h_file_name[n] = 0; if (n > 4 && strcmp (h_file_name + n - 4, "_NEW") == 0) h_file_name[n - 4] = 0; fprintf (h_file, "\n\n#ifndef QUARRY_%s\n#define QUARRY_%s\n", h_file_name, h_file_name); predefined_conditions = conditions; result = do_parse_lists (h_file, c_file, lists); fprintf (h_file, "\n\n#endif /* QUARRY_%s */\n", h_file_name); fclose (c_file); } fclose (h_file); } } string_list_empty (&list_files); while (condition_stack) pop_condition_stack (); } } else { print_usage (stderr); fprintf (stderr, "Try `%s --help' for more information.\n", full_program_name); } exit_parse_list_main: string_list_empty (&substitutions); utils_free_program_name_strings (); return result; }