~zulcss/samba/server-dailies-3.4

« back to all changes in this revision

Viewing changes to source4/heimdal/lib/com_err/parse.y

  • Committer: Chuck Short
  • Date: 2010-09-28 20:38:39 UTC
  • Revision ID: zulcss@ubuntu.com-20100928203839-pgjulytsi9ue63x1
Initial version

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
%{
 
2
/*
 
3
 * Copyright (c) 1998 - 2000 Kungliga Tekniska Högskolan
 
4
 * (Royal Institute of Technology, Stockholm, Sweden).
 
5
 * All rights reserved.
 
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
 *
 
11
 * 1. Redistributions of source code must retain the above copyright
 
12
 *    notice, this list of conditions and the following disclaimer.
 
13
 *
 
14
 * 2. Redistributions in binary form must reproduce the above copyright
 
15
 *    notice, this list of conditions and the following disclaimer in the
 
16
 *    documentation and/or other materials provided with the distribution.
 
17
 *
 
18
 * 3. Neither the name of the Institute nor the names of its contributors
 
19
 *    may be used to endorse or promote products derived from this software
 
20
 *    without specific prior written permission.
 
21
 *
 
22
 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
 
23
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 
24
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 
25
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
 
26
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 
27
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 
28
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 
29
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 
30
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 
31
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 
32
 * SUCH DAMAGE.
 
33
 */
 
34
 
 
35
#include "compile_et.h"
 
36
#include "lex.h"
 
37
 
 
38
RCSID("$Id$");
 
39
 
 
40
void yyerror (char *s);
 
41
static long name2number(const char *str);
 
42
 
 
43
extern char *yytext;
 
44
 
 
45
/* This is for bison */
 
46
 
 
47
#if !defined(alloca) && !defined(HAVE_ALLOCA)
 
48
#define alloca(x) malloc(x)
 
49
#endif
 
50
 
 
51
%}
 
52
 
 
53
%union {
 
54
  char *string;
 
55
  int number;
 
56
}
 
57
 
 
58
%token ET INDEX PREFIX EC ID END
 
59
%token <string> STRING
 
60
%token <number> NUMBER
 
61
 
 
62
%%
 
63
 
 
64
file            : /* */
 
65
                | header statements
 
66
                ;
 
67
 
 
68
header          : id et
 
69
                | et
 
70
                ;
 
71
 
 
72
id              : ID STRING
 
73
                {
 
74
                    id_str = $2;
 
75
                }
 
76
                ;
 
77
 
 
78
et              : ET STRING
 
79
                {
 
80
                    base_id = name2number($2);
 
81
                    strlcpy(name, $2, sizeof(name));
 
82
                    free($2);
 
83
                }
 
84
                | ET STRING STRING
 
85
                {
 
86
                    base_id = name2number($2);
 
87
                    strlcpy(name, $3, sizeof(name));
 
88
                    free($2);
 
89
                    free($3);
 
90
                }
 
91
                ;
 
92
 
 
93
statements      : statement
 
94
                | statements statement
 
95
                ;
 
96
 
 
97
statement       : INDEX NUMBER
 
98
                {
 
99
                        number = $2;
 
100
                }
 
101
                | PREFIX STRING
 
102
                {
 
103
                    free(prefix);
 
104
                    asprintf (&prefix, "%s_", $2);
 
105
                    if (prefix == NULL)
 
106
                        errx(1, "malloc");
 
107
                    free($2);
 
108
                }
 
109
                | PREFIX
 
110
                {
 
111
                    prefix = realloc(prefix, 1);
 
112
                    if (prefix == NULL)
 
113
                        errx(1, "malloc");
 
114
                    *prefix = '\0';
 
115
                }
 
116
                | EC STRING ',' STRING
 
117
                {
 
118
                    struct error_code *ec = malloc(sizeof(*ec));
 
119
                
 
120
                    if (ec == NULL)
 
121
                        errx(1, "malloc");
 
122
 
 
123
                    ec->next = NULL;
 
124
                    ec->number = number;
 
125
                    if(prefix && *prefix != '\0') {
 
126
                        asprintf (&ec->name, "%s%s", prefix, $2);
 
127
                        if (ec->name == NULL)
 
128
                            errx(1, "malloc");
 
129
                        free($2);
 
130
                    } else
 
131
                        ec->name = $2;
 
132
                    ec->string = $4;
 
133
                    APPEND(codes, ec);
 
134
                    number++;
 
135
                }
 
136
                | END
 
137
                {
 
138
                        YYACCEPT;
 
139
                }
 
140
                ;
 
141
 
 
142
%%
 
143
 
 
144
static long
 
145
name2number(const char *str)
 
146
{
 
147
    const char *p;
 
148
    long num = 0;
 
149
    const char *x = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 
150
        "abcdefghijklmnopqrstuvwxyz0123456789_";
 
151
    if(strlen(str) > 4) {
 
152
        yyerror("table name too long");
 
153
        return 0;
 
154
    }
 
155
    for(p = str; *p; p++){
 
156
        char *q = strchr(x, *p);
 
157
        if(q == NULL) {
 
158
            yyerror("invalid character in table name");
 
159
            return 0;
 
160
        }
 
161
        num = (num << 6) + (q - x) + 1;
 
162
    }
 
163
    num <<= 8;
 
164
    if(num > 0x7fffffff)
 
165
        num = -(0xffffffff - num + 1);
 
166
    return num;
 
167
}
 
168
 
 
169
void
 
170
yyerror (char *s)
 
171
{
 
172
     error_message ("%s\n", s);
 
173
}