~bkerensa/ubuntu/raring/yasm/fix-for-1064341

« back to all changes in this revision

Viewing changes to tools/genmacro/genmacro.c

  • Committer: Bazaar Package Importer
  • Author(s): Sam Hocevar
  • Date: 2009-07-14 08:23:59 UTC
  • mfrom: (1.1.4 upstream)
  • Revision ID: james.westby@ubuntu.com-20090714082359-10x8mjty41gzkshs
Tags: 0.8.0-1
* New upstream release (Closes: #531047).
* Removed all tasm patches, they’ve been merged upstream.
* debian/control: set debhelper dependency to 5.0 and policy to 3.8.2.
* debian/control: mention TASM in the long description.
* debian/compat: set debhelper level to 5.
* debian/links: link tasm to ytasm and tasm.1.gz to ytasm.1.gz.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* $Id: genmacro.c 2084 2008-05-09 07:08:17Z peter $
 
2
 *
 
3
 * C version of NASM's macros.pl
 
4
 *
 
5
 *  Copyright (C) 2004-2008  Peter Johnson
 
6
 *
 
7
 * Redistribution and use in source and binary forms, with or without
 
8
 * modification, are permitted provided that the following conditions
 
9
 * are met:
 
10
 * 1. Redistributions of source code must retain the above copyright
 
11
 *    notice, this list of conditions and the following disclaimer.
 
12
 * 2. Redistributions in binary form must reproduce the above copyright
 
13
 *    notice, this list of conditions and the following disclaimer in the
 
14
 *    documentation and/or other materials provided with the distribution.
 
15
 *
 
16
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS''
 
17
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 
18
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 
19
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE
 
20
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 
21
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 
22
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 
23
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 
24
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 
25
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 
26
 * POSSIBILITY OF SUCH DAMAGE.
 
27
 */
 
28
#include <stdio.h>
 
29
#include <stdlib.h>
 
30
#include <string.h>
 
31
 
 
32
#define MAXLINE 1024
 
33
 
 
34
int
 
35
main(int argc, char *argv[])
 
36
{
 
37
    FILE *in, *out;
 
38
    int i;
 
39
    char *str;
 
40
    char *strp;
 
41
    char *charp;
 
42
    int fline;
 
43
    int line = 0;
 
44
    int lindex = 0;
 
45
    size_t len;
 
46
 
 
47
    if (argc < 4) {
 
48
        fprintf(stderr, "Usage: %s <out> <var> <file> [<file> ...]\n", argv[0]);
 
49
        return EXIT_FAILURE;
 
50
    }
 
51
 
 
52
    out = fopen(argv[1], "wt");
 
53
 
 
54
    if (!out) {
 
55
        fprintf(stderr, "Could not open `%s'.\n", argv[1]);
 
56
        return EXIT_FAILURE;
 
57
    }
 
58
 
 
59
    str = malloc(MAXLINE);
 
60
 
 
61
    fprintf(out, "/* This file auto-generated from standard.mac by genmacro.c"
 
62
                 " - don't edit it */\n\n#include <stddef.h>\n\n"
 
63
                 "static const char *%s[] = {\n", argv[2]);
 
64
 
 
65
    for (i=3; i<argc; i++) {
 
66
        in = fopen(argv[i], "rt");
 
67
        if (!in) {
 
68
            fprintf(stderr, "Could not open `%s'.\n", argv[i]);
 
69
            fclose(out);
 
70
            remove(argv[1]);
 
71
            return EXIT_FAILURE;
 
72
        }
 
73
 
 
74
        fline = 0;
 
75
 
 
76
        while (fgets(str, MAXLINE, in)) {
 
77
            line++;
 
78
            fline++;
 
79
 
 
80
            strp = str;
 
81
 
 
82
            /* check for unterminated quotes and delete comments */
 
83
            charp = strp;
 
84
            while ((charp = strpbrk(charp, "'\";"))) {
 
85
                if (charp[0] == ';') {
 
86
                    *charp = '\0';
 
87
                    break;
 
88
                }
 
89
                if ((charp = strchr(charp+1, charp[0])) == NULL) {
 
90
                    fprintf(stderr, "%s:%d: error: unterminated quote\n",
 
91
                            argv[i], fline);
 
92
                    fclose(out);
 
93
                    remove(argv[1]);
 
94
                    return EXIT_FAILURE;
 
95
                }
 
96
                charp++;
 
97
            }
 
98
 
 
99
            /* strip off leading and trailing whitespace */
 
100
            while (*strp == ' ' || *strp == '\t')
 
101
                strp++;
 
102
            len = strlen(strp);
 
103
            while (len > 0 && (strp[len-1] == ' ' || strp[len-1] == '\t' ||
 
104
                               strp[len-1] == '\n')) {
 
105
                strp[len-1] = '\0';
 
106
                len--;
 
107
            }
 
108
 
 
109
            /* skip blank lines */
 
110
            if (len == 0)
 
111
                continue;
 
112
 
 
113
            /* output as string to output file */
 
114
            fprintf(out, "    \"");
 
115
            while (*strp != '\0') {
 
116
                if (*strp == '\\' || *strp == '"')
 
117
                    fputc('\\', out);
 
118
                fputc(*strp, out);
 
119
                strp++;
 
120
            }
 
121
            fprintf(out, "\",\n");
 
122
            lindex++;
 
123
        }
 
124
 
 
125
        fclose(in);
 
126
    }
 
127
 
 
128
    fprintf(out, "    NULL\n};\n");
 
129
    fclose(out);
 
130
 
 
131
    free(str);
 
132
 
 
133
    return EXIT_SUCCESS;
 
134
}