⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 params.c

📁 linux下将各类格式图片转换工具
💻 C
📖 第 1 页 / 共 2 页
字号:
	 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 (&params [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 (&params [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 + -