From 1030dc837b10a03a02a85d5504cbeec168ce49e2 Mon Sep 17 00:00:00 2001 From: Bernie Innocenti Date: Mon, 03 May 2010 21:53:47 +0000 Subject: Import XaoS r489 (trunk after version 3.5) --- (limited to 'src/ui/param.c') diff --git a/src/ui/param.c b/src/ui/param.c new file mode 100644 index 0000000..eb10a9d --- /dev/null +++ b/src/ui/param.c @@ -0,0 +1,172 @@ +/* + * XaoS, a fast portable realtime fractal zoomer + * Copyright (C) 1996,1997 by + * + * Jan Hubicka (hubicka@paru.cas.cz) + * Thomas Marsh (tmarsh@austin.ibm.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#ifdef _plan9_ +#include +#include +#else +#include +#include +#include +#endif +#include +#include +#include +#include +#include +#define MAXPARAMS 40 +static CONST struct params *params[40]; +int nparams; + +int params_parser(int argc, char **argv) +{ + int i, p = 0, d; + int ie = 0; + int is; + CONST struct params *par = NULL; + int error = 0; + int found; + for (i = 1; i < argc && !error; i++) { + found = 0; +#ifdef MACOSX + if (strncmp("-psn", argv[i], 4) == 0) + continue; +#endif + if (!strcmp("-help", argv[i])) { + error = 1; + break; + } + for (d = 0; d < nparams; d++) { + par = params[d]; + for (p = 0; par[p].name != NULL && !error; p++) { + if (!strcmp(par[p].name, argv[i])) { + found = 1; + is = i; + switch (par[p].type) { + case P_SWITCH: + *((int *) par[p].value) = 1; + break; + case P_NUMBER: + { + int n; + if (i == argc - 1) { + x_error + ("parameter %s requires numeric value.", + argv[i]); + error = 1; + break; + } + if (sscanf(argv[i + 1], "%i", &n) != 1) { + x_error("parameter for %s is not number.", + argv[i]); + error = 1; + break; + } + *((int *) par[p].value) = n; + i++; + } + break; + case P_FLOAT: + { + float n; + if (i == argc - 1) { + x_error + ("parameter %s requires floating point numeric value.", + argv[i]); + error = 1; + break; + } + if (sscanf(argv[i + 1], "%f", &n) != 1) { + x_error + ("parameter for %s is not floating point number.", + argv[i]); + error = 1; + break; + } + *((float *) par[p].value) = n; + i++; + } + break; + case P_STRING: + { + if (i == argc - 1) { + x_error + ("parameter %s requires string value.", + argv[i]); + error = 1; + break; + } + i++; + *((char **) par[p].value) = *(argv + i); + } + } + ie = i; + i = is; + } + } + } + if (d == nparams && !found) { + i = menu_processargs(i, argc, argv); + if (i < 0) { + error = 1; + break; + } else + i++; + } else + i = ie; + } + if (error) { + const char *name[] = { + "", + "number", + "string", + "f.point" + }; +#ifndef _plan9_ + printf(" XaoS" XaoS_VERSION " help text\n"); + printf + (" (This help is genereated automagically. I am sorry for all inconvencies)\n\n"); +#endif + printf("option string param description\n\n"); + for (d = 0; d < nparams; d++) { + par = params[d]; + for (p = 0; par[p].name != NULL; p++) { + if (par[p].type == P_HELP) + printf("\n%s\n\n", par[p].help); + else if (!par[p].type) + printf(" %-14s %s\n", par[p].name, par[p].help); + else + printf(" %-14s %s\n%14s %s\n", par[p].name, + name[par[p].type], "", par[p].help); + } + if (p == 0) + printf(" No options avaiable for now\n"); + } + menu_printhelp(); + return 0; + } + return (1); +} + +void params_register(CONST struct params *par) +{ + params[nparams++] = par; +} -- cgit v0.9.1