📄 params.c
字号:
error ("Invalid config filename."); } memcpy (usr_params, params, n1 * sizeof (param_t)); /* fill user struct */ free (sys_path); return optind;} void *parameter_value (const param_t *params, const char *name)/* * Extract value of parameter 'name.' of the given parameters 'params'. * * Return value: * value of given parameter */{ int pind = get_parameter_index (params, name); if (pind < 0) error ("Invalid parameter `%s'.", name); if (params [pind].type == PSTR || params [pind].type == POSTR) return (void *) params [pind].value.s; return (void *) &(params [pind].value);}voidask_and_set (param_t *params, const char *name, const char *msg)/* * Ask user (print given message 'msg') for missing mandatory * parameter 'name' of the given parameters 'params'. * * No return value. * * Side effects: * 'params ['name'].value' is changed */{ char answer [MAXSTRLEN]; int index = get_parameter_index (params, name); if (index < 0) error ("Invalid parameter %s.", name); if (msg) fprintf (stderr, "%s\n", msg); switch (params [index].type) { case PFLAG: /* Unusual, at least. */ warning ("Flags should be initialized and set on demand, " "not request"); case PINT: case PSTR: case POSTR: case PFLOAT: scanf (MAXSTRLEN_SCANF, answer); set_parameter (¶ms [index], answer); break; default: error ("Invalid parameter type for %s", name); }} voidwrite_parameters (const param_t *params, FILE *output)/* * Write all parameter settings to 'output'. * * No return value. */{ int pind; if (!params || !output) error ("Parameters must be not NULL."); for (pind = 0; params [pind].name != NULL; pind++) { fprintf (output, "# %s = ", params [pind].name); switch (params [pind].type) { case PFLAG: fprintf (output, "%s\n", params [pind].value.b ? "TRUE" : "FALSE"); break; case PINT: fprintf (output, "%d\n", params [pind].value.i); break; case PFLOAT: fprintf (output, "%.4f\n", (double) params [pind].value.f); break; case PSTR: case POSTR: fprintf (output, "%s\n", params [pind].value.s); break; default: error ("Invalid type %d for parameter %s", params [pind].type, params [pind].name); } } fputc ('\n', output);}/***************************************************************************** private code *****************************************************************************/static voidset_parameter (param_t *parameter, const char *value)/* * Set value of 'parameter' to 'value'. * * No return value. * * Side effects: * 'parameter.value' is changed accordingly */{ assert (parameter); switch (parameter->type) { case PFLAG: if (value != NULL && *value != '\0') { if (strcaseeq (value, "TRUE")) parameter->value.b = YES; else if (strcaseeq (value, "FALSE")) parameter->value.b = NO; else if (strcaseeq (value, "YES")) parameter->value.b = YES; else if (strcaseeq (value, "NO")) parameter->value.b = NO; else { long int data; char *endptr; data = strtol (value, &endptr, 0); if (*endptr != '\0' || endptr == value) warning ("Invalid value `%s' converted to %d", value, (int) data); parameter->value.b = data ? YES : NO; } } else parameter->value.b = !parameter->value.b; break; case PINT: { long int data; char *endptr; data = strtol (value, &endptr, 0); if (*endptr != '\0' || endptr == value) warning ("Invalid value `%s' converted to %d", value, (int) data); parameter->value.i = data; } break; case PFLOAT: { double data; char *endptr; data = strtod (value, &endptr); if (*endptr != '\0' || endptr == value) warning ("Invalid value `%s' converted to %f", value, (double) data); parameter->value.f = data; } break; case PSTR: case POSTR: parameter->value.s = value ? strdup (value) : NULL; break; default: error ("Invalid parameter type for %s", parameter->name); }}static intget_parameter_index (const param_t *params, const char *search_string)/* * Search for parameter with name 'search_string' in parameter struct. * * Return value: * index of parameter or -1 if no matching parameter has been found */{ int n; int index = -1; assert (params && search_string); for (n = 0; params [n].name != NULL; n++) if (strcaseeq (params [n].name, search_string)) { index = n; break; } return index;}static voidread_parameter_file (param_t *params, FILE *file)/* * Read parameter settings from 'file'. * * No return value. * * Side effects: * 'params [].value' are changed if specified in 'file' */{ char buffer [MAXSTRLEN]; int n = 0; assert (params && file); while (fgets (buffer, MAXSTRLEN, file) != NULL) { char *b; /* temporary variable */ char *name; /* parameter name */ char *value; /* parameter value */ int pind; /* current argument number */ b = strchr (buffer, '#'); if (b != NULL) /* Strip comments. */ *b = '\0'; b = strchr (buffer, '='); if (b == NULL) /* Strip lines that contain no '=' */ continue; *b = '\0'; /* Replace '=' by string terminator */ /* * Extract value of parameter */ for (value = b + 1; ISSPACE (*value); value++) ; /* Delete leading spaces */ for (b = value + strlen (value) - 1; b >= value && ISSPACE (*b); b--) *b = '\0'; /* Delete trailing spaces. */ /* * Extract parameter name */ for (name = buffer; ISSPACE (*name); name++) ; /* Delete leading spaces */ for (b = name + strlen (name) - 1; b >= name && ISSPACE (*b); b--) *b = '\0'; /* Delete trailing spaces. */ pind = get_parameter_index (params, name); if (pind >= 0) set_parameter (¶ms [pind], value); n++; }} static void usage (const param_t *params, const char *progname, const char *synopsis, const char *comment, const char *non_opt_string, bool_t show_all_options, const char *sys_file_name, const char *usr_file_name)/* * Generates and prints command line description from param_t struct 'params'. * 'progname' is the name of the excecutable, 'synopsis' a short program * description, and 'comment' some more advice. * If flag 'show_all_options' is set then print also options that are not * associated with a short option character. * 'sys_file_name' and 'usr_file_name' are filenames to parameter files. * * No return value. */{ int i; size_t width = 0; fprintf (stderr, "Usage: %s [OPTION]...%s\n", progname, non_opt_string ? non_opt_string : " "); if (synopsis != NULL) fprintf (stderr, synopsis); fprintf (stderr, "\n\n"); fprintf (stderr, "Mandatory or optional arguments to long options " "are mandatory or optional\nfor short options too. " "Default values are surrounded by {}.\n"); for (i = 0; params [i].name != NULL; i++) if (params [i].optchar != '\0' || show_all_options) { if (params [i].type == POSTR) width = max (width, (strlen (params [i].name) + strlen (params [i].argument_name) + 2)); else if (params [i].type != PFLAG) width = max (width, (strlen (params [i].name) + strlen (params [i].argument_name))); else width = max (width, (strlen (params [i].name)) - 1); } for (i = 0; params [i].name != NULL; i++) if (params [i].optchar != '\0' || show_all_options) { if (params [i].optchar != '\0') fprintf (stderr, " -%c, --", params [i].optchar); else fprintf (stderr, " --"); if (params [i].type == POSTR) fprintf (stderr, "%s=[%s]%-*s ", params [i].name, params [i].argument_name, max (0, (width - 2 - strlen (params [i].name) - strlen (params [i].argument_name))), ""); else if (params [i].type != PFLAG) fprintf (stderr, "%s=%-*s ", params [i].name, width - strlen (params [i].name), params [i].argument_name); else fprintf (stderr, "%-*s ", width + 1, params [i].name); fprintf (stderr, params [i].use, params [i].argument_name); switch (params [i].type) { case PFLAG: break; case PINT: fprintf (stderr, "{%d}", params [i].value.i); break; case PFLOAT: fprintf (stderr, "{%.2f}", (double) params [i].value.f); break; case PSTR: case POSTR: if (params [i].value.s) fprintf (stderr, "{%s}", params [i].value.s); break; default: error ("type %d for %s invalid", params [i].type, params [i].name); } fprintf (stderr, "\n"); } fprintf (stderr, "\n"); fprintf (stderr, "Parameter initialization order:\n"); fprintf (stderr, "1.) %s\n2.) $HOME/%s\t 3.) command line\t 4.) --config=file", sys_file_name, usr_file_name); fprintf (stderr, "\n\n"); if (comment != NULL) fprintf (stderr, "%s\n", comment); exit (1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -