blob: 57c3bdfd15b16f5733bc8e86ec064ffe04dafced [file] [log] [blame]
/*
* Generic Options Support Header File
*
* Copyright (c) 2001 Stanislav Karchebny <berk@madfire.net>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the author nor the names of other contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <util.h>
#include <ctype.h>
#include "tasm-options.h"
#ifdef __DEBUG__
#define DEBUG(x) fprintf ## x ;
#else
#define DEBUG(x)
#endif
/* Options Parser */
int
parse_cmdline(int argc, char **argv, opt_option *options, size_t nopts,
void (*print_error) (const char *fmt, ...))
{
int errors = 0, warnings = 0;
size_t i;
int got_it;
DEBUG((stderr, "parse_cmdline: entered\n"));
fail:
while (--argc) {
argv++;
if (argv[0][0] == '/' && argv[0][1]) { /* opt */
got_it = 0;
for (i = 0; i < nopts; i++) {
char *cmd = &argv[0][1];
size_t len = strlen(options[i].opt);
if (yasm__strncasecmp(cmd, options[i].opt, len) == 0) {
char *param;
param = &argv[0][1+len];
if (options[i].takes_param) {
if (param[0] == '\0') {
print_error(
_("option `-%c' needs an argument!"),
options[i].opt);
errors++;
goto fail;
} else {
argc--;
argv++;
}
} else
param = NULL;
if (!options[i].handler(cmd, param, options[i].extra))
got_it = 1;
break;
}
}
if (!got_it) {
print_error(_("warning: unrecognized option `%s'"),
argv[0]);
warnings++;
}
} else { /* not an option, then it should be a file or something */
if (not_an_option_handler(argv[0]))
errors++;
}
}
DEBUG((stderr, "parse_cmdline: finished\n"));
return errors;
}
void
help_msg(const char *msg, const char *tail, opt_option *options, size_t nopts)
{
char optbuf[100];
size_t i;
printf("%s", gettext(msg));
for (i = 0; i < nopts; i++) {
optbuf[0] = 0;
if (options[i].takes_param) {
if (options[i].opt)
sprintf(optbuf, "/%s <%s>", options[i].opt,
options[i].param_desc ? options[i].
param_desc : _("param"));
} else {
if (options[i].opt)
sprintf(optbuf, "/%s", options[i].opt);
}
printf(" %-22s %s\n", optbuf, gettext(options[i].description));
}
printf("%s", gettext(tail));
}