yacc.y revision 1.4 1 1.4 jmc /* $NetBSD: yacc.y,v 1.4 2003/10/28 04:00:51 jmc Exp $ */
2 1.1 tshiozak
3 1.1 tshiozak %{
4 1.1 tshiozak /*-
5 1.1 tshiozak * Copyright (c)2003 Citrus Project,
6 1.1 tshiozak * All rights reserved.
7 1.1 tshiozak *
8 1.1 tshiozak * Redistribution and use in source and binary forms, with or without
9 1.1 tshiozak * modification, are permitted provided that the following conditions
10 1.1 tshiozak * are met:
11 1.1 tshiozak * 1. Redistributions of source code must retain the above copyright
12 1.1 tshiozak * notice, this list of conditions and the following disclaimer.
13 1.1 tshiozak * 2. Redistributions in binary form must reproduce the above copyright
14 1.1 tshiozak * notice, this list of conditions and the following disclaimer in the
15 1.1 tshiozak * documentation and/or other materials provided with the distribution.
16 1.1 tshiozak *
17 1.1 tshiozak * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 1.1 tshiozak * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 1.1 tshiozak * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 1.1 tshiozak * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 1.1 tshiozak * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 1.1 tshiozak * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 1.1 tshiozak * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 1.1 tshiozak * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 1.1 tshiozak * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 1.1 tshiozak * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 1.1 tshiozak * SUCH DAMAGE.
28 1.1 tshiozak */
29 1.1 tshiozak
30 1.3 lukem #if HAVE_NBTOOL_CONFIG_H
31 1.3 lukem #include "nbtool_config.h"
32 1.1 tshiozak #endif
33 1.1 tshiozak
34 1.1 tshiozak #include <sys/cdefs.h>
35 1.3 lukem #if !defined(lint)
36 1.4 jmc __RCSID("$NetBSD: yacc.y,v 1.4 2003/10/28 04:00:51 jmc Exp $");
37 1.3 lukem #endif /* not lint */
38 1.1 tshiozak
39 1.1 tshiozak #include <assert.h>
40 1.1 tshiozak #include <err.h>
41 1.1 tshiozak #include <errno.h>
42 1.1 tshiozak #include <limits.h>
43 1.1 tshiozak #include <stdio.h>
44 1.1 tshiozak #include <stdlib.h>
45 1.1 tshiozak #include <string.h>
46 1.1 tshiozak #include <unistd.h>
47 1.4 jmc #include <arpa/inet.h>
48 1.1 tshiozak #include <sys/types.h>
49 1.1 tshiozak
50 1.1 tshiozak #include "ldef.h"
51 1.1 tshiozak
52 1.1 tshiozak #ifndef __packed
53 1.1 tshiozak #define __packed
54 1.1 tshiozak #endif
55 1.1 tshiozak
56 1.1 tshiozak #include "citrus_namespace.h"
57 1.1 tshiozak #include "citrus_types.h"
58 1.1 tshiozak #include "citrus_mapper_std_file.h"
59 1.1 tshiozak #include "citrus_region.h"
60 1.1 tshiozak #include "citrus_db_factory.h"
61 1.1 tshiozak #include "citrus_db_hash.h"
62 1.1 tshiozak #include "citrus_lookup_factory.h"
63 1.1 tshiozak #include "citrus_pivot_factory.h"
64 1.1 tshiozak
65 1.1 tshiozak int debug = 0;
66 1.1 tshiozak static char *output = NULL;
67 1.1 tshiozak static void *table = NULL;
68 1.1 tshiozak static size_t table_size;
69 1.1 tshiozak static char *map_name;
70 1.1 tshiozak static int map_type;
71 1.1 tshiozak static zone_t src_zone;
72 1.1 tshiozak static u_int32_t colmask, rowmask;
73 1.2 tshiozak static u_int32_t dst_invalid, dst_ilseq, oob_mode, dst_unit_bits;
74 1.1 tshiozak static void (*putfunc)(void *, size_t, u_int32_t) = 0;
75 1.1 tshiozak
76 1.1 tshiozak static u_int32_t src_next;
77 1.1 tshiozak static int next_valid;
78 1.1 tshiozak
79 1.1 tshiozak static u_int32_t done_flag = 0;
80 1.1 tshiozak #define DF_TYPE 0x00000001
81 1.1 tshiozak #define DF_NAME 0x00000002
82 1.1 tshiozak #define DF_SRC_ZONE 0x00000004
83 1.1 tshiozak #define DF_DST_INVALID 0x00000008
84 1.2 tshiozak #define DF_DST_ILSEQ 0x00000010
85 1.2 tshiozak #define DF_DST_UNIT_BITS 0x00000020
86 1.2 tshiozak #define DF_OOB_MODE 0x00000040
87 1.1 tshiozak
88 1.1 tshiozak static void dump_file(void);
89 1.1 tshiozak static void setup_map(void);
90 1.1 tshiozak static void set_type(int);
91 1.1 tshiozak static void set_name(char *);
92 1.1 tshiozak static void set_src_zone(const zone_t *);
93 1.1 tshiozak static void set_dst_invalid(u_int32_t);
94 1.2 tshiozak static void set_dst_ilseq(u_int32_t);
95 1.1 tshiozak static void set_dst_unit_bits(u_int32_t);
96 1.2 tshiozak static void set_oob_mode(u_int32_t);
97 1.1 tshiozak static void calc_next(void);
98 1.1 tshiozak static int check_src(u_int32_t, u_int32_t);
99 1.1 tshiozak static void store(const linear_zone_t *, u_int32_t, int);
100 1.1 tshiozak static void put8(void *, size_t, u_int32_t);
101 1.1 tshiozak static void put16(void *, size_t, u_int32_t);
102 1.1 tshiozak static void put32(void *, size_t, u_int32_t);
103 1.1 tshiozak %}
104 1.1 tshiozak
105 1.1 tshiozak %union {
106 1.1 tshiozak u_int32_t i_value;
107 1.1 tshiozak char *s_value;
108 1.1 tshiozak zone_t z_value;
109 1.1 tshiozak linear_zone_t lz_value;
110 1.1 tshiozak }
111 1.1 tshiozak
112 1.2 tshiozak %token R_TYPE R_NAME R_SRC_ZONE R_DST_UNIT_BITS
113 1.2 tshiozak %token R_DST_INVALID R_DST_ILSEQ
114 1.1 tshiozak %token R_BEGIN_MAP R_END_MAP R_INVALID R_ROWCOL
115 1.2 tshiozak %token R_ILSEQ R_OOB_MODE
116 1.1 tshiozak %token R_LN
117 1.1 tshiozak %token <i_value> L_IMM
118 1.1 tshiozak %token <s_value> L_STRING
119 1.1 tshiozak
120 1.1 tshiozak %type <z_value> zone
121 1.1 tshiozak %type <lz_value> src
122 1.2 tshiozak %type <i_value> dst types oob_mode_sel
123 1.1 tshiozak
124 1.1 tshiozak %%
125 1.1 tshiozak
126 1.1 tshiozak file : property mapping lns
127 1.1 tshiozak { dump_file(); }
128 1.1 tshiozak
129 1.1 tshiozak property : /* empty */
130 1.1 tshiozak | property R_LN
131 1.1 tshiozak | property name
132 1.1 tshiozak | property type
133 1.1 tshiozak | property src_zone
134 1.1 tshiozak | property dst_invalid
135 1.2 tshiozak | property dst_ilseq
136 1.1 tshiozak | property dst_unit_bits
137 1.2 tshiozak | property oob_mode
138 1.1 tshiozak
139 1.1 tshiozak name : R_NAME L_STRING { set_name($2); $2 = NULL; }
140 1.1 tshiozak type : R_TYPE types { set_type($2); }
141 1.1 tshiozak types : R_ROWCOL { $$ = R_ROWCOL; }
142 1.1 tshiozak src_zone : R_SRC_ZONE zone { set_src_zone(&$2); }
143 1.1 tshiozak zone : L_IMM '-' L_IMM {
144 1.1 tshiozak $$.row_begin = $$.row_end = 0;
145 1.1 tshiozak $$.col_begin = $1; $$.col_end = $3;
146 1.1 tshiozak $$.col_bits = 32;
147 1.1 tshiozak }
148 1.1 tshiozak | L_IMM '-' L_IMM '/' L_IMM '-' L_IMM '/' L_IMM {
149 1.1 tshiozak $$.row_begin = $1; $$.row_end = $3;
150 1.1 tshiozak $$.col_begin = $5; $$.col_end = $7;
151 1.1 tshiozak $$.col_bits = $9;
152 1.1 tshiozak }
153 1.1 tshiozak
154 1.1 tshiozak dst_invalid : R_DST_INVALID L_IMM { set_dst_invalid($2); }
155 1.2 tshiozak dst_ilseq : R_DST_ILSEQ L_IMM { set_dst_ilseq($2); }
156 1.1 tshiozak dst_unit_bits : R_DST_UNIT_BITS L_IMM { set_dst_unit_bits($2); }
157 1.2 tshiozak oob_mode : R_OOB_MODE oob_mode_sel { set_oob_mode($2); }
158 1.1 tshiozak
159 1.2 tshiozak oob_mode_sel : R_INVALID { $$ = _CITRUS_MAPPER_STD_OOB_NONIDENTICAL; }
160 1.2 tshiozak | R_ILSEQ { $$ = _CITRUS_MAPPER_STD_OOB_ILSEQ; }
161 1.1 tshiozak
162 1.1 tshiozak mapping : begin_map map_elems R_END_MAP
163 1.1 tshiozak begin_map : R_BEGIN_MAP lns { setup_map(); }
164 1.1 tshiozak
165 1.1 tshiozak map_elems : /* empty */
166 1.1 tshiozak | map_elems map_elem lns
167 1.1 tshiozak
168 1.1 tshiozak map_elem : src '=' dst
169 1.1 tshiozak { store(&$1, $3, 0); }
170 1.1 tshiozak | src '=' L_IMM '-'
171 1.1 tshiozak { store(&$1, $3, 1); }
172 1.1 tshiozak dst : L_IMM
173 1.1 tshiozak {
174 1.1 tshiozak $$ = $1;
175 1.1 tshiozak }
176 1.1 tshiozak | R_INVALID
177 1.1 tshiozak {
178 1.1 tshiozak $$ = dst_invalid;
179 1.1 tshiozak }
180 1.2 tshiozak | R_ILSEQ
181 1.2 tshiozak {
182 1.2 tshiozak $$ = dst_ilseq;
183 1.2 tshiozak }
184 1.1 tshiozak
185 1.1 tshiozak src : /* empty */
186 1.1 tshiozak {
187 1.1 tshiozak if (!next_valid) {
188 1.1 tshiozak yyerror("cannot omit src");
189 1.1 tshiozak }
190 1.1 tshiozak $$.begin = $$.end = src_next;
191 1.1 tshiozak calc_next();
192 1.1 tshiozak }
193 1.1 tshiozak | L_IMM
194 1.1 tshiozak {
195 1.1 tshiozak if (check_src($1, $1)) {
196 1.1 tshiozak yyerror("illegal zone");
197 1.1 tshiozak }
198 1.1 tshiozak $$.begin = $$.end = $1;
199 1.1 tshiozak src_next = $1;
200 1.1 tshiozak calc_next();
201 1.1 tshiozak }
202 1.1 tshiozak | L_IMM '-' L_IMM
203 1.1 tshiozak {
204 1.1 tshiozak if (check_src($1, $3)) {
205 1.1 tshiozak yyerror("illegal zone");
206 1.1 tshiozak }
207 1.1 tshiozak $$.begin = $1; $$.end = $3;
208 1.1 tshiozak src_next = $3;
209 1.1 tshiozak calc_next();
210 1.1 tshiozak }
211 1.1 tshiozak | '-' L_IMM
212 1.1 tshiozak {
213 1.1 tshiozak if (!next_valid) {
214 1.1 tshiozak yyerror("cannot omit src");
215 1.1 tshiozak }
216 1.1 tshiozak if (check_src(src_next, $2)) {
217 1.1 tshiozak yyerror("illegal zone");
218 1.1 tshiozak }
219 1.1 tshiozak $$.begin = src_next; $$.end = $2;
220 1.1 tshiozak src_next = $2;
221 1.1 tshiozak calc_next();
222 1.1 tshiozak }
223 1.1 tshiozak lns : R_LN
224 1.1 tshiozak | lns R_LN
225 1.1 tshiozak
226 1.1 tshiozak %%
227 1.1 tshiozak
228 1.1 tshiozak static void
229 1.1 tshiozak warning(const char *s)
230 1.1 tshiozak {
231 1.1 tshiozak fprintf(stderr, "%s in %d\n", s, line_number);
232 1.1 tshiozak }
233 1.1 tshiozak
234 1.1 tshiozak int
235 1.1 tshiozak yyerror(const char *s)
236 1.1 tshiozak {
237 1.1 tshiozak warning(s);
238 1.1 tshiozak exit(1);
239 1.1 tshiozak }
240 1.1 tshiozak
241 1.1 tshiozak void
242 1.1 tshiozak put8(void *ptr, size_t ofs, u_int32_t val)
243 1.1 tshiozak {
244 1.1 tshiozak *((u_int8_t *)ptr + ofs) = val;
245 1.1 tshiozak }
246 1.1 tshiozak
247 1.1 tshiozak void
248 1.1 tshiozak put16(void *ptr, size_t ofs, u_int32_t val)
249 1.1 tshiozak {
250 1.1 tshiozak u_int16_t oval = htons(val);
251 1.1 tshiozak memcpy((u_int16_t *)ptr + ofs, &oval, 2);
252 1.1 tshiozak }
253 1.1 tshiozak
254 1.1 tshiozak void
255 1.1 tshiozak put32(void *ptr, size_t ofs, u_int32_t val)
256 1.1 tshiozak {
257 1.1 tshiozak u_int32_t oval = htonl(val);
258 1.1 tshiozak memcpy((u_int32_t *)ptr + ofs, &oval, 4);
259 1.1 tshiozak }
260 1.1 tshiozak
261 1.1 tshiozak static void
262 1.1 tshiozak alloc_table(void)
263 1.1 tshiozak {
264 1.1 tshiozak size_t i;
265 1.2 tshiozak u_int32_t val;
266 1.1 tshiozak
267 1.1 tshiozak table_size =
268 1.1 tshiozak (src_zone.row_end-src_zone.row_begin+1)*
269 1.1 tshiozak (src_zone.col_end-src_zone.col_begin+1);
270 1.1 tshiozak table = malloc(table_size*dst_unit_bits/8);
271 1.1 tshiozak if (!table) {
272 1.1 tshiozak perror("malloc");
273 1.1 tshiozak exit(1);
274 1.1 tshiozak }
275 1.1 tshiozak
276 1.2 tshiozak switch (oob_mode) {
277 1.2 tshiozak case _CITRUS_MAPPER_STD_OOB_NONIDENTICAL:
278 1.2 tshiozak val = dst_invalid;
279 1.2 tshiozak break;
280 1.2 tshiozak case _CITRUS_MAPPER_STD_OOB_ILSEQ:
281 1.2 tshiozak val = dst_ilseq;
282 1.2 tshiozak break;
283 1.2 tshiozak default:
284 1.2 tshiozak _DIAGASSERT(0);
285 1.2 tshiozak }
286 1.1 tshiozak for (i=0; i<table_size; i++)
287 1.2 tshiozak (*putfunc)(table, i, val);
288 1.1 tshiozak }
289 1.1 tshiozak
290 1.1 tshiozak static void
291 1.1 tshiozak setup_map(void)
292 1.1 tshiozak {
293 1.1 tshiozak
294 1.1 tshiozak if ((done_flag & DF_SRC_ZONE)==0) {
295 1.1 tshiozak fprintf(stderr, "SRC_ZONE is mandatory.\n");
296 1.1 tshiozak exit(1);
297 1.1 tshiozak }
298 1.1 tshiozak if ((done_flag & DF_DST_UNIT_BITS)==0) {
299 1.1 tshiozak fprintf(stderr, "DST_UNIT_BITS is mandatory.\n");
300 1.1 tshiozak exit(1);
301 1.1 tshiozak }
302 1.1 tshiozak
303 1.1 tshiozak if ((done_flag & DF_DST_INVALID) == 0)
304 1.1 tshiozak dst_invalid = 0xFFFFFFFF;
305 1.2 tshiozak if ((done_flag & DF_DST_ILSEQ) == 0)
306 1.2 tshiozak dst_ilseq = 0xFFFFFFFE;
307 1.2 tshiozak if ((done_flag & DF_OOB_MODE) == 0)
308 1.2 tshiozak oob_mode = _CITRUS_MAPPER_STD_OOB_NONIDENTICAL;
309 1.1 tshiozak
310 1.1 tshiozak alloc_table();
311 1.1 tshiozak }
312 1.1 tshiozak
313 1.1 tshiozak static void
314 1.1 tshiozak create_rowcol_info(struct _region *r)
315 1.1 tshiozak {
316 1.1 tshiozak void *ptr;
317 1.1 tshiozak size_t ofs;
318 1.1 tshiozak
319 1.1 tshiozak ofs = 0;
320 1.1 tshiozak ptr = malloc(_CITRUS_MAPPER_STD_ROWCOL_INFO_SIZE);
321 1.1 tshiozak if (ptr==NULL)
322 1.1 tshiozak err(EXIT_FAILURE, "malloc");
323 1.1 tshiozak
324 1.1 tshiozak put32(ptr, ofs, src_zone.col_bits); ofs++;
325 1.1 tshiozak put32(ptr, ofs, dst_invalid); ofs++;
326 1.1 tshiozak put32(ptr, ofs, src_zone.row_begin); ofs++;
327 1.1 tshiozak put32(ptr, ofs, src_zone.row_end); ofs++;
328 1.1 tshiozak put32(ptr, ofs, src_zone.col_begin); ofs++;
329 1.1 tshiozak put32(ptr, ofs, src_zone.col_end); ofs++;
330 1.1 tshiozak put32(ptr, ofs, dst_unit_bits); ofs++;
331 1.1 tshiozak put32(ptr, ofs, 0); /* pad */
332 1.1 tshiozak
333 1.1 tshiozak _region_init(r, ptr, _CITRUS_MAPPER_STD_ROWCOL_INFO_SIZE);
334 1.1 tshiozak }
335 1.1 tshiozak
336 1.2 tshiozak static void
337 1.2 tshiozak create_rowcol_ext_ilseq_info(struct _region *r)
338 1.2 tshiozak {
339 1.2 tshiozak void *ptr;
340 1.2 tshiozak size_t ofs;
341 1.2 tshiozak
342 1.2 tshiozak ofs = 0;
343 1.2 tshiozak ptr = malloc(_CITRUS_MAPPER_STD_ROWCOL_EXT_ILSEQ_SIZE);
344 1.2 tshiozak if (ptr==NULL)
345 1.2 tshiozak err(EXIT_FAILURE, "malloc");
346 1.2 tshiozak
347 1.2 tshiozak put32(ptr, ofs, oob_mode); ofs++;
348 1.2 tshiozak put32(ptr, ofs, dst_ilseq); ofs++;
349 1.2 tshiozak
350 1.2 tshiozak _region_init(r, ptr, _CITRUS_MAPPER_STD_ROWCOL_EXT_ILSEQ_SIZE);
351 1.2 tshiozak }
352 1.2 tshiozak
353 1.1 tshiozak #define CHKERR(ret, func, a) \
354 1.1 tshiozak do { \
355 1.1 tshiozak ret = func a; \
356 1.1 tshiozak if (ret) \
357 1.1 tshiozak errx(EXIT_FAILURE, "%s: %s", #func, strerror(ret)); \
358 1.1 tshiozak } while (/*CONSTCOND*/0)
359 1.1 tshiozak
360 1.1 tshiozak static void
361 1.1 tshiozak dump_file(void)
362 1.1 tshiozak {
363 1.1 tshiozak FILE *fp;
364 1.1 tshiozak int ret;
365 1.1 tshiozak struct _db_factory *df;
366 1.1 tshiozak struct _region data;
367 1.1 tshiozak void *serialized;
368 1.1 tshiozak size_t size;
369 1.1 tshiozak
370 1.1 tshiozak /*
371 1.1 tshiozak * build database
372 1.1 tshiozak */
373 1.1 tshiozak CHKERR(ret, _db_factory_create, (&df, _db_hash_std, NULL));
374 1.1 tshiozak
375 1.1 tshiozak /* store type */
376 1.1 tshiozak CHKERR(ret, _db_factory_addstr_by_s,
377 1.1 tshiozak (df, _CITRUS_MAPPER_STD_SYM_TYPE,
378 1.1 tshiozak _CITRUS_MAPPER_STD_TYPE_ROWCOL));
379 1.1 tshiozak
380 1.1 tshiozak /* store info */
381 1.1 tshiozak create_rowcol_info(&data);
382 1.1 tshiozak CHKERR(ret, _db_factory_add_by_s,
383 1.1 tshiozak (df, _CITRUS_MAPPER_STD_SYM_INFO, &data, 1));
384 1.1 tshiozak
385 1.2 tshiozak /* ilseq extension */
386 1.2 tshiozak create_rowcol_ext_ilseq_info(&data);
387 1.2 tshiozak CHKERR(ret, _db_factory_add_by_s,
388 1.2 tshiozak (df, _CITRUS_MAPPER_STD_SYM_ROWCOL_EXT_ILSEQ, &data, 1));
389 1.2 tshiozak
390 1.1 tshiozak /* store table */
391 1.1 tshiozak _region_init(&data, table, table_size*dst_unit_bits/8);
392 1.1 tshiozak CHKERR(ret, _db_factory_add_by_s,
393 1.1 tshiozak (df, _CITRUS_MAPPER_STD_SYM_TABLE, &data, 1));
394 1.1 tshiozak
395 1.1 tshiozak /*
396 1.1 tshiozak * dump database to file
397 1.1 tshiozak */
398 1.1 tshiozak if (output)
399 1.1 tshiozak fp = fopen(output, "wb");
400 1.1 tshiozak else
401 1.1 tshiozak fp = stdout;
402 1.1 tshiozak
403 1.1 tshiozak if (fp == NULL) {
404 1.1 tshiozak perror("fopen");
405 1.1 tshiozak exit(1);
406 1.1 tshiozak }
407 1.1 tshiozak
408 1.1 tshiozak /* dump database body */
409 1.1 tshiozak size = _db_factory_calc_size(df);
410 1.1 tshiozak serialized = malloc(size);
411 1.1 tshiozak _region_init(&data, serialized, size);
412 1.1 tshiozak CHKERR(ret, _db_factory_serialize,
413 1.1 tshiozak (df, _CITRUS_MAPPER_STD_MAGIC, &data));
414 1.1 tshiozak if (fwrite(serialized, size, 1, fp) != 1)
415 1.1 tshiozak err(EXIT_FAILURE, "fwrite");
416 1.1 tshiozak
417 1.1 tshiozak fclose(fp);
418 1.1 tshiozak }
419 1.1 tshiozak
420 1.1 tshiozak static void
421 1.1 tshiozak /*ARGSUSED*/
422 1.1 tshiozak set_type(int type)
423 1.1 tshiozak {
424 1.1 tshiozak
425 1.1 tshiozak if (done_flag & DF_TYPE) {
426 1.1 tshiozak warning("TYPE is duplicated. ignored this one");
427 1.1 tshiozak return;
428 1.1 tshiozak }
429 1.1 tshiozak
430 1.1 tshiozak map_type = type;
431 1.1 tshiozak
432 1.1 tshiozak done_flag |= DF_TYPE;
433 1.1 tshiozak }
434 1.1 tshiozak static void
435 1.1 tshiozak /*ARGSUSED*/
436 1.1 tshiozak set_name(char *str)
437 1.1 tshiozak {
438 1.1 tshiozak
439 1.1 tshiozak if (done_flag & DF_NAME) {
440 1.1 tshiozak warning("NAME is duplicated. ignored this one");
441 1.1 tshiozak return;
442 1.1 tshiozak }
443 1.1 tshiozak
444 1.1 tshiozak map_name = str;
445 1.1 tshiozak
446 1.1 tshiozak done_flag |= DF_NAME;
447 1.1 tshiozak }
448 1.1 tshiozak static void
449 1.1 tshiozak set_src_zone(const zone_t *zone)
450 1.1 tshiozak {
451 1.1 tshiozak
452 1.1 tshiozak if (done_flag & DF_SRC_ZONE) {
453 1.1 tshiozak warning("SRC_ZONE is duplicated. ignored this one");
454 1.1 tshiozak return;
455 1.1 tshiozak }
456 1.1 tshiozak
457 1.1 tshiozak /* sanity check */
458 1.1 tshiozak if (zone->col_bits<1 || zone->col_bits>32) {
459 1.1 tshiozak goto bad;
460 1.1 tshiozak }
461 1.1 tshiozak
462 1.1 tshiozak if (zone->col_bits!=32)
463 1.1 tshiozak colmask = (1 << zone->col_bits)-1;
464 1.1 tshiozak else
465 1.1 tshiozak colmask = ~0;
466 1.1 tshiozak rowmask = ~colmask;
467 1.1 tshiozak if (zone->col_begin > zone->col_end ||
468 1.1 tshiozak zone->row_begin > zone->row_end ||
469 1.1 tshiozak (zone->col_begin & rowmask)!=0 ||
470 1.1 tshiozak (zone->col_end & rowmask)!=0 ||
471 1.1 tshiozak ((zone->row_begin << zone->col_bits) & colmask)!=0 ||
472 1.1 tshiozak ((zone->row_end << zone->col_bits) & colmask)!=0) {
473 1.1 tshiozak bad:
474 1.1 tshiozak yyerror("Illegal argument for SRC_ZONE");
475 1.1 tshiozak }
476 1.1 tshiozak
477 1.1 tshiozak src_zone = *zone;
478 1.1 tshiozak
479 1.1 tshiozak done_flag |= DF_SRC_ZONE;
480 1.1 tshiozak
481 1.1 tshiozak return;
482 1.1 tshiozak }
483 1.1 tshiozak static void
484 1.1 tshiozak set_dst_invalid(u_int32_t val)
485 1.1 tshiozak {
486 1.1 tshiozak
487 1.1 tshiozak if (done_flag & DF_DST_INVALID) {
488 1.1 tshiozak warning("DST_INVALID is duplicated. ignored this one");
489 1.1 tshiozak return;
490 1.1 tshiozak }
491 1.1 tshiozak
492 1.1 tshiozak dst_invalid = val;
493 1.1 tshiozak
494 1.1 tshiozak done_flag |= DF_DST_INVALID;
495 1.2 tshiozak }
496 1.2 tshiozak static void
497 1.2 tshiozak set_dst_ilseq(u_int32_t val)
498 1.2 tshiozak {
499 1.2 tshiozak
500 1.2 tshiozak if (done_flag & DF_DST_ILSEQ) {
501 1.2 tshiozak warning("DST_ILSEQ is duplicated. ignored this one");
502 1.2 tshiozak return;
503 1.2 tshiozak }
504 1.2 tshiozak
505 1.2 tshiozak dst_ilseq = val;
506 1.2 tshiozak
507 1.2 tshiozak done_flag |= DF_DST_ILSEQ;
508 1.2 tshiozak }
509 1.2 tshiozak static void
510 1.2 tshiozak set_oob_mode(u_int32_t val)
511 1.2 tshiozak {
512 1.2 tshiozak
513 1.2 tshiozak if (done_flag & DF_OOB_MODE) {
514 1.2 tshiozak warning("OOB_MODE is duplicated. ignored this one");
515 1.2 tshiozak return;
516 1.2 tshiozak }
517 1.2 tshiozak
518 1.2 tshiozak oob_mode = val;
519 1.2 tshiozak
520 1.2 tshiozak done_flag |= DF_OOB_MODE;
521 1.1 tshiozak }
522 1.1 tshiozak static void
523 1.1 tshiozak set_dst_unit_bits(u_int32_t val)
524 1.1 tshiozak {
525 1.1 tshiozak
526 1.1 tshiozak if (done_flag & DF_DST_UNIT_BITS) {
527 1.1 tshiozak warning("DST_UNIT_BITS is duplicated. ignored this one");
528 1.1 tshiozak return;
529 1.1 tshiozak }
530 1.1 tshiozak
531 1.1 tshiozak switch (val) {
532 1.1 tshiozak case 8:
533 1.1 tshiozak putfunc = &put8;
534 1.1 tshiozak dst_unit_bits = val;
535 1.1 tshiozak break;
536 1.1 tshiozak case 16:
537 1.1 tshiozak putfunc = &put16;
538 1.1 tshiozak dst_unit_bits = val;
539 1.1 tshiozak break;
540 1.1 tshiozak case 32:
541 1.1 tshiozak putfunc = &put32;
542 1.1 tshiozak dst_unit_bits = val;
543 1.1 tshiozak break;
544 1.1 tshiozak default:
545 1.1 tshiozak yyerror("Illegal argument for DST_UNIT_BITS");
546 1.1 tshiozak }
547 1.1 tshiozak done_flag |= DF_DST_UNIT_BITS;
548 1.1 tshiozak }
549 1.1 tshiozak static void
550 1.1 tshiozak calc_next(void)
551 1.1 tshiozak {
552 1.1 tshiozak src_next++;
553 1.1 tshiozak if (check_src(src_next, src_next))
554 1.1 tshiozak next_valid = 0;
555 1.1 tshiozak else
556 1.1 tshiozak next_valid = 1;
557 1.1 tshiozak }
558 1.1 tshiozak static int
559 1.1 tshiozak check_src(u_int32_t begin, u_int32_t end)
560 1.1 tshiozak {
561 1.1 tshiozak u_int32_t b_row = 0, e_row = 0, b_col, e_col;
562 1.1 tshiozak
563 1.1 tshiozak b_col = begin & colmask;
564 1.1 tshiozak e_col = end & colmask;
565 1.1 tshiozak if (src_zone.col_bits != 32) {
566 1.1 tshiozak b_row = begin >> src_zone.col_bits;
567 1.1 tshiozak e_row = end >> src_zone.col_bits;
568 1.1 tshiozak }
569 1.1 tshiozak
570 1.1 tshiozak if (b_row != e_row ||
571 1.1 tshiozak b_row < src_zone.row_begin ||
572 1.1 tshiozak b_row > src_zone.row_end ||
573 1.1 tshiozak e_row < src_zone.row_begin ||
574 1.1 tshiozak e_row > src_zone.row_end ||
575 1.1 tshiozak b_col < src_zone.col_begin ||
576 1.1 tshiozak b_col > src_zone.col_end ||
577 1.1 tshiozak e_col < src_zone.col_begin ||
578 1.1 tshiozak e_col > src_zone.col_end ||
579 1.1 tshiozak b_col>e_col) {
580 1.1 tshiozak return (-1);
581 1.1 tshiozak }
582 1.1 tshiozak return (0);
583 1.1 tshiozak }
584 1.1 tshiozak static void
585 1.1 tshiozak store(const linear_zone_t *lz, u_int32_t dst, int inc)
586 1.1 tshiozak {
587 1.1 tshiozak u_int32_t row=0, col, ofs, i;
588 1.1 tshiozak
589 1.1 tshiozak if (src_zone.col_bits != 32)
590 1.1 tshiozak row = lz->begin >> src_zone.col_bits;
591 1.1 tshiozak col = lz->begin & colmask;
592 1.1 tshiozak ofs =
593 1.1 tshiozak (row-src_zone.row_begin)*(src_zone.col_end-src_zone.col_begin+1) +
594 1.1 tshiozak (col-src_zone.col_begin);
595 1.1 tshiozak for (i=lz->end-lz->begin+1; i>0; i--) {
596 1.1 tshiozak (*putfunc)(table, ofs++, dst);
597 1.1 tshiozak if (inc)
598 1.1 tshiozak dst++;
599 1.1 tshiozak }
600 1.1 tshiozak }
601 1.1 tshiozak
602 1.1 tshiozak static void
603 1.1 tshiozak do_mkdb(FILE *in)
604 1.1 tshiozak {
605 1.1 tshiozak int ret;
606 1.1 tshiozak FILE *out;
607 1.1 tshiozak
608 1.1 tshiozak /* dump DB to file */
609 1.1 tshiozak if (output)
610 1.1 tshiozak out = fopen(output, "wb");
611 1.1 tshiozak else
612 1.1 tshiozak out = stdout;
613 1.1 tshiozak
614 1.1 tshiozak if (out==NULL)
615 1.1 tshiozak err(EXIT_FAILURE, "fopen");
616 1.1 tshiozak
617 1.1 tshiozak ret = _lookup_factory_convert(out, in);
618 1.1 tshiozak fclose(out);
619 1.1 tshiozak if (ret && output)
620 1.1 tshiozak unlink(output); /* dump failure */
621 1.1 tshiozak }
622 1.1 tshiozak
623 1.1 tshiozak static void
624 1.1 tshiozak do_mkpv(FILE *in)
625 1.1 tshiozak {
626 1.1 tshiozak int ret;
627 1.1 tshiozak FILE *out;
628 1.1 tshiozak
629 1.1 tshiozak /* dump pivot to file */
630 1.1 tshiozak if (output)
631 1.1 tshiozak out = fopen(output, "wb");
632 1.1 tshiozak else
633 1.1 tshiozak out = stdout;
634 1.1 tshiozak
635 1.1 tshiozak if (out==NULL)
636 1.1 tshiozak err(EXIT_FAILURE, "fopen");
637 1.1 tshiozak
638 1.1 tshiozak ret = _pivot_factory_convert(out, in);
639 1.1 tshiozak fclose(out);
640 1.1 tshiozak if (ret && output)
641 1.1 tshiozak unlink(output); /* dump failure */
642 1.1 tshiozak if (ret)
643 1.1 tshiozak errx(EXIT_FAILURE, "%s\n", strerror(ret));
644 1.1 tshiozak }
645 1.1 tshiozak
646 1.1 tshiozak static void
647 1.1 tshiozak usage(void)
648 1.1 tshiozak {
649 1.1 tshiozak warnx("usage: \n"
650 1.1 tshiozak "\t%s [-d] [-o outfile] [infile]\n"
651 1.1 tshiozak "\t%s -m [-d] [-o outfile] [infile]\n"
652 1.1 tshiozak "\t%s -p [-d] [-o outfile] [infile]\n",
653 1.1 tshiozak getprogname(), getprogname(), getprogname());
654 1.1 tshiozak exit(1);
655 1.1 tshiozak }
656 1.1 tshiozak
657 1.1 tshiozak int
658 1.1 tshiozak main(int argc, char **argv)
659 1.1 tshiozak {
660 1.1 tshiozak int ch;
661 1.1 tshiozak extern char *optarg;
662 1.1 tshiozak extern int optind;
663 1.1 tshiozak FILE *in;
664 1.1 tshiozak int mkdb = 0, mkpv = 0;
665 1.1 tshiozak
666 1.1 tshiozak while ((ch=getopt(argc, argv, "do:mp")) != EOF) {
667 1.1 tshiozak switch (ch) {
668 1.1 tshiozak case 'd':
669 1.1 tshiozak debug=1;
670 1.1 tshiozak break;
671 1.1 tshiozak case 'o':
672 1.1 tshiozak output = strdup(optarg);
673 1.1 tshiozak break;
674 1.1 tshiozak case 'm':
675 1.1 tshiozak mkdb = 1;
676 1.1 tshiozak break;
677 1.1 tshiozak case 'p':
678 1.1 tshiozak mkpv = 1;
679 1.1 tshiozak break;
680 1.1 tshiozak default:
681 1.1 tshiozak usage();
682 1.1 tshiozak }
683 1.1 tshiozak }
684 1.1 tshiozak
685 1.1 tshiozak argc-=optind;
686 1.1 tshiozak argv+=optind;
687 1.1 tshiozak switch (argc) {
688 1.1 tshiozak case 0:
689 1.1 tshiozak in = stdin;
690 1.1 tshiozak break;
691 1.1 tshiozak case 1:
692 1.1 tshiozak in = fopen(argv[0], "r");
693 1.1 tshiozak if (!in)
694 1.1 tshiozak err(EXIT_FAILURE, argv[0]);
695 1.1 tshiozak break;
696 1.1 tshiozak default:
697 1.1 tshiozak usage();
698 1.1 tshiozak }
699 1.1 tshiozak
700 1.1 tshiozak if (mkdb)
701 1.1 tshiozak do_mkdb(in);
702 1.1 tshiozak else if (mkpv)
703 1.1 tshiozak do_mkpv(in);
704 1.1 tshiozak else {
705 1.1 tshiozak yyin = in;
706 1.1 tshiozak yyparse();
707 1.1 tshiozak }
708 1.1 tshiozak
709 1.1 tshiozak return (0);
710 1.1 tshiozak }
711