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