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