aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/yasm/frontends/tasm/tasm-options.c
blob: 3baee28fbb6d05bbabe830ce28b14e82cf1ff2f1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/* 
 * 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)); 
}