lcgen.c revision 3f54fd611f536639ec30dd53c48e5ec1897cc7d9
359a38ce40498397028473d956691915ed3e849atavmjong-free/***********************************************************************
359a38ce40498397028473d956691915ed3e849atavmjong-free* *
359a38ce40498397028473d956691915ed3e849atavmjong-free* This software is part of the ast package *
359a38ce40498397028473d956691915ed3e849atavmjong-free* Copyright (c) 1985-2011 AT&T Intellectual Property *
359a38ce40498397028473d956691915ed3e849atavmjong-free* and is licensed under the *
359a38ce40498397028473d956691915ed3e849atavmjong-free* Eclipse Public License, Version 1.0 *
359a38ce40498397028473d956691915ed3e849atavmjong-free* by AT&T Intellectual Property *
359a38ce40498397028473d956691915ed3e849atavmjong-free* *
359a38ce40498397028473d956691915ed3e849atavmjong-free* A copy of the License is available at *
359a38ce40498397028473d956691915ed3e849atavmjong-free* http://www.eclipse.org/org/documents/epl-v10.html *
359a38ce40498397028473d956691915ed3e849atavmjong-free* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
359a38ce40498397028473d956691915ed3e849atavmjong-free* *
359a38ce40498397028473d956691915ed3e849atavmjong-free* Information and Software Systems Research *
359a38ce40498397028473d956691915ed3e849atavmjong-free* AT&T Research *
359a38ce40498397028473d956691915ed3e849atavmjong-free* Florham Park NJ *
359a38ce40498397028473d956691915ed3e849atavmjong-free* *
359a38ce40498397028473d956691915ed3e849atavmjong-free* Glenn Fowler <gsf@research.att.com> *
359a38ce40498397028473d956691915ed3e849atavmjong-free* David Korn <dgk@research.att.com> *
359a38ce40498397028473d956691915ed3e849atavmjong-free* Phong Vo <kpv@research.att.com> *
359a38ce40498397028473d956691915ed3e849atavmjong-free* *
359a38ce40498397028473d956691915ed3e849atavmjong-free***********************************************************************/
3fad3df12ae2d320c12871d471eb0faf5f187cbdAlex Valavanis/*
359a38ce40498397028473d956691915ed3e849atavmjong-free * generate <lc.h> implementation tables from lc.tab
359a38ce40498397028473d956691915ed3e849atavmjong-free * this must make it through vanilla cc with no -last
359a38ce40498397028473d956691915ed3e849atavmjong-free *
359a38ce40498397028473d956691915ed3e849atavmjong-free * # comment
359a38ce40498397028473d956691915ed3e849atavmjong-free * :charset:
359a38ce40498397028473d956691915ed3e849atavmjong-free * code name ms-codepage
359a38ce40498397028473d956691915ed3e849atavmjong-free * :language:
359a38ce40498397028473d956691915ed3e849atavmjong-free * code name alt1|alt2... charset|... attr1|attr2|...
359a38ce40498397028473d956691915ed3e849atavmjong-free * ...
359a38ce40498397028473d956691915ed3e849atavmjong-free * :territory:
359a38ce40498397028473d956691915ed3e849atavmjong-free * code name lang1|lang2...
359a38ce40498397028473d956691915ed3e849atavmjong-free * :abbreviation:
359a38ce40498397028473d956691915ed3e849atavmjong-free */
359a38ce40498397028473d956691915ed3e849atavmjong-free
359a38ce40498397028473d956691915ed3e849atavmjong-free#include <stdio.h>
359a38ce40498397028473d956691915ed3e849atavmjong-free#include <ctype.h>
359a38ce40498397028473d956691915ed3e849atavmjong-free#ifdef __STDC__
359a38ce40498397028473d956691915ed3e849atavmjong-free#include <stdlib.h>
359a38ce40498397028473d956691915ed3e849atavmjong-free#include <string.h>
359a38ce40498397028473d956691915ed3e849atavmjong-free#endif
359a38ce40498397028473d956691915ed3e849atavmjong-free
d1561c248f49dc3508ae9e6557fc0d371928e394Markus Engeltypedef struct Link_s
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White{
359a38ce40498397028473d956691915ed3e849atavmjong-free struct Link_s* next;
359a38ce40498397028473d956691915ed3e849atavmjong-free char* code;
359a38ce40498397028473d956691915ed3e849atavmjong-free int index;
359a38ce40498397028473d956691915ed3e849atavmjong-free} Link_t;
359a38ce40498397028473d956691915ed3e849atavmjong-free
359a38ce40498397028473d956691915ed3e849atavmjong-freetypedef struct Table_s
359a38ce40498397028473d956691915ed3e849atavmjong-free{
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White Link_t* root;
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White int count;
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White} Table_t;
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. Whitetypedef struct Abbreviation_s
359a38ce40498397028473d956691915ed3e849atavmjong-free{
359a38ce40498397028473d956691915ed3e849atavmjong-free Link_t link;
359a38ce40498397028473d956691915ed3e849atavmjong-free char* value;
359a38ce40498397028473d956691915ed3e849atavmjong-free} Abbreviation_t;
359a38ce40498397028473d956691915ed3e849atavmjong-free
359a38ce40498397028473d956691915ed3e849atavmjong-freetypedef struct Attribute_s
359a38ce40498397028473d956691915ed3e849atavmjong-free{
359a38ce40498397028473d956691915ed3e849atavmjong-free Link_t link;
359a38ce40498397028473d956691915ed3e849atavmjong-free} Attribute_t;
359a38ce40498397028473d956691915ed3e849atavmjong-free
359a38ce40498397028473d956691915ed3e849atavmjong-freetypedef struct Attribute_list_s
359a38ce40498397028473d956691915ed3e849atavmjong-free{
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White struct Attribute_list_s*next;
359a38ce40498397028473d956691915ed3e849atavmjong-free Attribute_t* attribute;
359a38ce40498397028473d956691915ed3e849atavmjong-free} Attribute_list_t;
359a38ce40498397028473d956691915ed3e849atavmjong-free
359a38ce40498397028473d956691915ed3e849atavmjong-freetypedef struct Charset_s
359a38ce40498397028473d956691915ed3e849atavmjong-free{
359a38ce40498397028473d956691915ed3e849atavmjong-free Link_t link;
359a38ce40498397028473d956691915ed3e849atavmjong-free char* alternates;
359a38ce40498397028473d956691915ed3e849atavmjong-free char* ms;
3eb97a45889abb73fa05c413b45785ea682f07c5Jon A. Cruz} Charset_t;
359a38ce40498397028473d956691915ed3e849atavmjong-free
359a38ce40498397028473d956691915ed3e849atavmjong-freetypedef struct Language_s
359a38ce40498397028473d956691915ed3e849atavmjong-free{
359a38ce40498397028473d956691915ed3e849atavmjong-free Link_t link;
359a38ce40498397028473d956691915ed3e849atavmjong-free char* name;
359a38ce40498397028473d956691915ed3e849atavmjong-free char* alternates;
359a38ce40498397028473d956691915ed3e849atavmjong-free Charset_t* charset;
359a38ce40498397028473d956691915ed3e849atavmjong-free Attribute_list_t* attributes;
359a38ce40498397028473d956691915ed3e849atavmjong-free} Language_t;
359a38ce40498397028473d956691915ed3e849atavmjong-free
359a38ce40498397028473d956691915ed3e849atavmjong-freetypedef struct Language_list_s
359a38ce40498397028473d956691915ed3e849atavmjong-free{
359a38ce40498397028473d956691915ed3e849atavmjong-free struct Language_list_s* next;
359a38ce40498397028473d956691915ed3e849atavmjong-free Language_t* language;
359a38ce40498397028473d956691915ed3e849atavmjong-free} Language_list_t;
359a38ce40498397028473d956691915ed3e849atavmjong-free
359a38ce40498397028473d956691915ed3e849atavmjong-freetypedef struct Territory_s
5f19756f48574526dda8abedebf811c9d1456e80Markus Engel{
359a38ce40498397028473d956691915ed3e849atavmjong-free Link_t link;
359a38ce40498397028473d956691915ed3e849atavmjong-free char* name;
359a38ce40498397028473d956691915ed3e849atavmjong-free Language_list_t* languages;
359a38ce40498397028473d956691915ed3e849atavmjong-free int primary;
359a38ce40498397028473d956691915ed3e849atavmjong-free int index;
359a38ce40498397028473d956691915ed3e849atavmjong-free} Territory_t;
359a38ce40498397028473d956691915ed3e849atavmjong-free
359a38ce40498397028473d956691915ed3e849atavmjong-freetypedef struct Map_s
359a38ce40498397028473d956691915ed3e849atavmjong-free{
359a38ce40498397028473d956691915ed3e849atavmjong-free Link_t link;
359a38ce40498397028473d956691915ed3e849atavmjong-free Language_t* language;
359a38ce40498397028473d956691915ed3e849atavmjong-free Territory_t* territory;
359a38ce40498397028473d956691915ed3e849atavmjong-free Charset_t* charset;
359a38ce40498397028473d956691915ed3e849atavmjong-free Attribute_t* attribute;
359a38ce40498397028473d956691915ed3e849atavmjong-free} Map_t;
359a38ce40498397028473d956691915ed3e849atavmjong-free
359a38ce40498397028473d956691915ed3e849atavmjong-freestatic struct State_s
359a38ce40498397028473d956691915ed3e849atavmjong-free{
359a38ce40498397028473d956691915ed3e849atavmjong-free Table_t attribute;
359a38ce40498397028473d956691915ed3e849atavmjong-free Table_t charset;
359a38ce40498397028473d956691915ed3e849atavmjong-free Table_t language;
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White Table_t territory;
359a38ce40498397028473d956691915ed3e849atavmjong-free Table_t map;
3eb97a45889abb73fa05c413b45785ea682f07c5Jon A. Cruz} state;
359a38ce40498397028473d956691915ed3e849atavmjong-free
359a38ce40498397028473d956691915ed3e849atavmjong-free#define INIT 0
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White#define CHARSET 1
359a38ce40498397028473d956691915ed3e849atavmjong-free#define LANGUAGE 2
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White#define TERRITORY 3
359a38ce40498397028473d956691915ed3e849atavmjong-free#define MAP 4
359a38ce40498397028473d956691915ed3e849atavmjong-free
359a38ce40498397028473d956691915ed3e849atavmjong-free#define elementsof(x) (sizeof(x)/sizeof(x[0]))
359a38ce40498397028473d956691915ed3e849atavmjong-free#define newof(p,t,n,x) ((t*)malloc(sizeof(t)*(n)+(x)))
359a38ce40498397028473d956691915ed3e849atavmjong-free
359a38ce40498397028473d956691915ed3e849atavmjong-freestatic Link_t*
359a38ce40498397028473d956691915ed3e849atavmjong-free#if defined(__STDC__) || defined(__cplusplus)
359a38ce40498397028473d956691915ed3e849atavmjong-freeenter(register Table_t* tab, register Link_t* v)
359a38ce40498397028473d956691915ed3e849atavmjong-free#else
359a38ce40498397028473d956691915ed3e849atavmjong-freeenter(tab, v)
359a38ce40498397028473d956691915ed3e849atavmjong-freeregister Table_t* tab;
359a38ce40498397028473d956691915ed3e849atavmjong-freeregister Link_t* v;
359a38ce40498397028473d956691915ed3e849atavmjong-free#endif
359a38ce40498397028473d956691915ed3e849atavmjong-free{
359a38ce40498397028473d956691915ed3e849atavmjong-free register Link_t* x;
359a38ce40498397028473d956691915ed3e849atavmjong-free register Link_t* p;
359a38ce40498397028473d956691915ed3e849atavmjong-free
359a38ce40498397028473d956691915ed3e849atavmjong-free for (p = 0, x = tab->root; x; p = x, x = x->next)
359a38ce40498397028473d956691915ed3e849atavmjong-free if (!strcmp(x->code, v->code))
359a38ce40498397028473d956691915ed3e849atavmjong-free return x;
3eb97a45889abb73fa05c413b45785ea682f07c5Jon A. Cruz if (p)
3eb97a45889abb73fa05c413b45785ea682f07c5Jon A. Cruz p->next = v;
359a38ce40498397028473d956691915ed3e849atavmjong-free else
359a38ce40498397028473d956691915ed3e849atavmjong-free tab->root = v;
359a38ce40498397028473d956691915ed3e849atavmjong-free v->next = 0;
359a38ce40498397028473d956691915ed3e849atavmjong-free v->index = tab->count++;
359a38ce40498397028473d956691915ed3e849atavmjong-free return v;
359a38ce40498397028473d956691915ed3e849atavmjong-free}
359a38ce40498397028473d956691915ed3e849atavmjong-free
359a38ce40498397028473d956691915ed3e849atavmjong-freestatic Link_t*
359a38ce40498397028473d956691915ed3e849atavmjong-free#if defined(__STDC__) || defined(__cplusplus)
359a38ce40498397028473d956691915ed3e849atavmjong-freelookup(register Table_t* tab, register char* s)
359a38ce40498397028473d956691915ed3e849atavmjong-free#else
359a38ce40498397028473d956691915ed3e849atavmjong-freelookup(tab, s)
359a38ce40498397028473d956691915ed3e849atavmjong-freeregister Table_t* tab;
359a38ce40498397028473d956691915ed3e849atavmjong-freeregister char* s;
359a38ce40498397028473d956691915ed3e849atavmjong-free#endif
3eb97a45889abb73fa05c413b45785ea682f07c5Jon A. Cruz{
3eb97a45889abb73fa05c413b45785ea682f07c5Jon A. Cruz register Link_t* x;
359a38ce40498397028473d956691915ed3e849atavmjong-free
359a38ce40498397028473d956691915ed3e849atavmjong-free for (x = tab->root; x; x = x->next)
359a38ce40498397028473d956691915ed3e849atavmjong-free if (!strcmp(x->code, s))
359a38ce40498397028473d956691915ed3e849atavmjong-free return x;
359a38ce40498397028473d956691915ed3e849atavmjong-free return 0;
359a38ce40498397028473d956691915ed3e849atavmjong-free}
359a38ce40498397028473d956691915ed3e849atavmjong-free
359a38ce40498397028473d956691915ed3e849atavmjong-freestatic char*
359a38ce40498397028473d956691915ed3e849atavmjong-free#if defined(__STDC__) || defined(__cplusplus)
359a38ce40498397028473d956691915ed3e849atavmjong-freecopy(char** p, register char* f)
359a38ce40498397028473d956691915ed3e849atavmjong-free#else
359a38ce40498397028473d956691915ed3e849atavmjong-freecopy(p, f)
359a38ce40498397028473d956691915ed3e849atavmjong-freechar** p;
359a38ce40498397028473d956691915ed3e849atavmjong-freeregister char* f;
359a38ce40498397028473d956691915ed3e849atavmjong-free#endif
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White{
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White register char* t;
359a38ce40498397028473d956691915ed3e849atavmjong-free char* b;
359a38ce40498397028473d956691915ed3e849atavmjong-free
359a38ce40498397028473d956691915ed3e849atavmjong-free if (!f)
359a38ce40498397028473d956691915ed3e849atavmjong-free return 0;
359a38ce40498397028473d956691915ed3e849atavmjong-free b = t = *p;
359a38ce40498397028473d956691915ed3e849atavmjong-free while (*t++ = *f++);
359a38ce40498397028473d956691915ed3e849atavmjong-free *p = t;
359a38ce40498397028473d956691915ed3e849atavmjong-free return b;
359a38ce40498397028473d956691915ed3e849atavmjong-free}
359a38ce40498397028473d956691915ed3e849atavmjong-free
359a38ce40498397028473d956691915ed3e849atavmjong-freestatic void
359a38ce40498397028473d956691915ed3e849atavmjong-free#if defined(__STDC__) || defined(__cplusplus)
359a38ce40498397028473d956691915ed3e849atavmjong-freemacro(FILE* f, char* p1, char* p2, char* p3)
359a38ce40498397028473d956691915ed3e849atavmjong-free#else
359a38ce40498397028473d956691915ed3e849atavmjong-freemacro(f, p1, p2, p3)
359a38ce40498397028473d956691915ed3e849atavmjong-freeFILE* f;
359a38ce40498397028473d956691915ed3e849atavmjong-freechar* p1;
359a38ce40498397028473d956691915ed3e849atavmjong-freechar* p2;
359a38ce40498397028473d956691915ed3e849atavmjong-freechar* p3;
359a38ce40498397028473d956691915ed3e849atavmjong-free#endif
359a38ce40498397028473d956691915ed3e849atavmjong-free{
359a38ce40498397028473d956691915ed3e849atavmjong-free register int c;
359a38ce40498397028473d956691915ed3e849atavmjong-free register char* s;
359a38ce40498397028473d956691915ed3e849atavmjong-free register char* b;
359a38ce40498397028473d956691915ed3e849atavmjong-free register char* e;
359a38ce40498397028473d956691915ed3e849atavmjong-free int i;
359a38ce40498397028473d956691915ed3e849atavmjong-free int m;
359a38ce40498397028473d956691915ed3e849atavmjong-free int n;
359a38ce40498397028473d956691915ed3e849atavmjong-free char* part[4];
359a38ce40498397028473d956691915ed3e849atavmjong-free char buf[128];
359a38ce40498397028473d956691915ed3e849atavmjong-free
359a38ce40498397028473d956691915ed3e849atavmjong-free part[0] = p1;
359a38ce40498397028473d956691915ed3e849atavmjong-free part[1] = p2;
359a38ce40498397028473d956691915ed3e849atavmjong-free part[2] = p3;
359a38ce40498397028473d956691915ed3e849atavmjong-free part[3] = 0;
359a38ce40498397028473d956691915ed3e849atavmjong-free n = 0;
359a38ce40498397028473d956691915ed3e849atavmjong-free fprintf(f, "\n");
359a38ce40498397028473d956691915ed3e849atavmjong-free do
359a38ce40498397028473d956691915ed3e849atavmjong-free {
359a38ce40498397028473d956691915ed3e849atavmjong-free i = m = 0;
359a38ce40498397028473d956691915ed3e849atavmjong-free b = buf;
359a38ce40498397028473d956691915ed3e849atavmjong-free e = &buf[sizeof(buf)-1];
359a38ce40498397028473d956691915ed3e849atavmjong-free while (b < e)
359a38ce40498397028473d956691915ed3e849atavmjong-free {
359a38ce40498397028473d956691915ed3e849atavmjong-free if (!(s = part[i++]))
359a38ce40498397028473d956691915ed3e849atavmjong-free break;
359a38ce40498397028473d956691915ed3e849atavmjong-free if (i > 1)
359a38ce40498397028473d956691915ed3e849atavmjong-free *b++ = '_';
359a38ce40498397028473d956691915ed3e849atavmjong-free while ((c = *s++) && b < e)
359a38ce40498397028473d956691915ed3e849atavmjong-free {
359a38ce40498397028473d956691915ed3e849atavmjong-free if (c == '|')
359a38ce40498397028473d956691915ed3e849atavmjong-free {
359a38ce40498397028473d956691915ed3e849atavmjong-free part[i-1] = s;
359a38ce40498397028473d956691915ed3e849atavmjong-free m = 1;
359a38ce40498397028473d956691915ed3e849atavmjong-free break;
359a38ce40498397028473d956691915ed3e849atavmjong-free }
359a38ce40498397028473d956691915ed3e849atavmjong-free else if (islower(c))
359a38ce40498397028473d956691915ed3e849atavmjong-free c = toupper(c);
359a38ce40498397028473d956691915ed3e849atavmjong-free else if (!isalnum(c))
359a38ce40498397028473d956691915ed3e849atavmjong-free c = '_';
359a38ce40498397028473d956691915ed3e849atavmjong-free *b++ = c;
359a38ce40498397028473d956691915ed3e849atavmjong-free }
359a38ce40498397028473d956691915ed3e849atavmjong-free }
359a38ce40498397028473d956691915ed3e849atavmjong-free *b = 0;
359a38ce40498397028473d956691915ed3e849atavmjong-free fprintf(f, "#ifdef %s\n%s,\n#else\n", buf, buf);
359a38ce40498397028473d956691915ed3e849atavmjong-free n++;
359a38ce40498397028473d956691915ed3e849atavmjong-free } while (m);
359a38ce40498397028473d956691915ed3e849atavmjong-free fprintf(f, "0,\n");
359a38ce40498397028473d956691915ed3e849atavmjong-free while (n-- > 0)
359a38ce40498397028473d956691915ed3e849atavmjong-free fprintf(f, "#endif\n");
359a38ce40498397028473d956691915ed3e849atavmjong-free}
359a38ce40498397028473d956691915ed3e849atavmjong-free
359a38ce40498397028473d956691915ed3e849atavmjong-free#if defined(__STDC__) || defined(__cplusplus)
359a38ce40498397028473d956691915ed3e849atavmjong-freeint
359a38ce40498397028473d956691915ed3e849atavmjong-freemain(int argc, char** argv)
359a38ce40498397028473d956691915ed3e849atavmjong-free#else
359a38ce40498397028473d956691915ed3e849atavmjong-freeint
359a38ce40498397028473d956691915ed3e849atavmjong-freemain(argc, argv)
bf9ec3e969ba6b11cbbc613545aedc63cc886973Matthew Petroffint argc;
359a38ce40498397028473d956691915ed3e849atavmjong-freechar** argv;
359a38ce40498397028473d956691915ed3e849atavmjong-free#endif
add38d633bbf8ef881bdb908735ea27385c554b8Matthew Petroff{
359a38ce40498397028473d956691915ed3e849atavmjong-free register char* s;
359a38ce40498397028473d956691915ed3e849atavmjong-free register char** vp;
359a38ce40498397028473d956691915ed3e849atavmjong-free register char** ve;
359a38ce40498397028473d956691915ed3e849atavmjong-free Attribute_t* ap;
359a38ce40498397028473d956691915ed3e849atavmjong-free Attribute_list_t* al;
359a38ce40498397028473d956691915ed3e849atavmjong-free Attribute_list_t* az;
359a38ce40498397028473d956691915ed3e849atavmjong-free Charset_t* cp;
359a38ce40498397028473d956691915ed3e849atavmjong-free Territory_t* tp;
359a38ce40498397028473d956691915ed3e849atavmjong-free Language_t* lp;
359a38ce40498397028473d956691915ed3e849atavmjong-free Language_list_t* ll;
359a38ce40498397028473d956691915ed3e849atavmjong-free Language_list_t* lz;
359a38ce40498397028473d956691915ed3e849atavmjong-free Map_t* mp;
bf9ec3e969ba6b11cbbc613545aedc63cc886973Matthew Petroff char* b;
359a38ce40498397028473d956691915ed3e849atavmjong-free char* f;
359a38ce40498397028473d956691915ed3e849atavmjong-free char* command;
add38d633bbf8ef881bdb908735ea27385c554b8Matthew Petroff char* hdr;
359a38ce40498397028473d956691915ed3e849atavmjong-free char* lib;
359a38ce40498397028473d956691915ed3e849atavmjong-free FILE* hf;
359a38ce40498397028473d956691915ed3e849atavmjong-free FILE* lf;
359a38ce40498397028473d956691915ed3e849atavmjong-free int c;
359a38ce40498397028473d956691915ed3e849atavmjong-free int i;
359a38ce40498397028473d956691915ed3e849atavmjong-free int line;
359a38ce40498397028473d956691915ed3e849atavmjong-free int type;
359a38ce40498397028473d956691915ed3e849atavmjong-free int language_attribute_max;
359a38ce40498397028473d956691915ed3e849atavmjong-free int territory_language_max;
359a38ce40498397028473d956691915ed3e849atavmjong-free char* arg[5];
359a38ce40498397028473d956691915ed3e849atavmjong-free char buf[1024];
359a38ce40498397028473d956691915ed3e849atavmjong-free
359a38ce40498397028473d956691915ed3e849atavmjong-free command = *argv++;
359a38ce40498397028473d956691915ed3e849atavmjong-free line = 0;
359a38ce40498397028473d956691915ed3e849atavmjong-free if (!(hdr = *argv++) || !(lib = *argv++) || *argv)
359a38ce40498397028473d956691915ed3e849atavmjong-free {
359a38ce40498397028473d956691915ed3e849atavmjong-free fprintf(stderr, "%s: { hdr lib tab } arguments expected\n", command);
359a38ce40498397028473d956691915ed3e849atavmjong-free return 1;
359a38ce40498397028473d956691915ed3e849atavmjong-free }
359a38ce40498397028473d956691915ed3e849atavmjong-free if (!(hf = fopen(hdr, "w")))
359a38ce40498397028473d956691915ed3e849atavmjong-free {
359a38ce40498397028473d956691915ed3e849atavmjong-free fprintf(stderr, "%s: %s: cannot write\n", command, hdr);
359a38ce40498397028473d956691915ed3e849atavmjong-free return 1;
359a38ce40498397028473d956691915ed3e849atavmjong-free }
359a38ce40498397028473d956691915ed3e849atavmjong-free if (!(lf = fopen(lib, "w")))
359a38ce40498397028473d956691915ed3e849atavmjong-free {
359a38ce40498397028473d956691915ed3e849atavmjong-free fprintf(stderr, "%s: %s: cannot write\n", command, lib);
359a38ce40498397028473d956691915ed3e849atavmjong-free return 1;
359a38ce40498397028473d956691915ed3e849atavmjong-free }
359a38ce40498397028473d956691915ed3e849atavmjong-free type = 0;
359a38ce40498397028473d956691915ed3e849atavmjong-free language_attribute_max = 0;
359a38ce40498397028473d956691915ed3e849atavmjong-free territory_language_max = 0;
359a38ce40498397028473d956691915ed3e849atavmjong-free state.language.count = 2;
359a38ce40498397028473d956691915ed3e849atavmjong-free state.territory.count = 3;
359a38ce40498397028473d956691915ed3e849atavmjong-free ve = &arg[elementsof(arg)];
359a38ce40498397028473d956691915ed3e849atavmjong-free fprintf(hf, "/* : : generated by %s : : */\n", command);
359a38ce40498397028473d956691915ed3e849atavmjong-free fprintf(hf, "#pragma prototyped\n");
359a38ce40498397028473d956691915ed3e849atavmjong-free fprintf(hf, "\n");
359a38ce40498397028473d956691915ed3e849atavmjong-free fprintf(hf, "#ifndef _LC_H\n");
359a38ce40498397028473d956691915ed3e849atavmjong-free fprintf(hf, "#define _LC_H\t\t\t1\n");
359a38ce40498397028473d956691915ed3e849atavmjong-free fprintf(hf, "\n");
359a38ce40498397028473d956691915ed3e849atavmjong-free fprintf(hf, "#include <ast.h>\n");
359a38ce40498397028473d956691915ed3e849atavmjong-free fprintf(hf, "\n");
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White fprintf(hf, "#define LC_abbreviated\t\t0x00001\n");
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White fprintf(hf, "#define LC_checked\t\t0x00002\n");
359a38ce40498397028473d956691915ed3e849atavmjong-free fprintf(hf, "#define LC_debug\t\t0x00004\n");
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White fprintf(hf, "#define LC_default\t\t0x00008\n");
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White fprintf(hf, "#define LC_defined\t\t0x00010\n");
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White fprintf(hf, "#define LC_local\t\t0x00020\n");
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White fprintf(hf, "#define LC_primary\t\t0x00040\n");
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White fprintf(hf, "#define LC_qualified\t\t0x00080\n");
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White fprintf(hf, "#define LC_undefined\t\t0x00100\n");
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White fprintf(hf, "#define LC_utf8\t\t\t0x00200\n");
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White fprintf(hf, "#define LC_verbose\t\t0x00400\n");
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White fprintf(hf, "#define LC_setlocale\t\t0x10000\n");
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White fprintf(hf, "#define LC_setenv\t\t0x20000\n");
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White fprintf(hf, "#define LC_user\t\t\t0x40000\n");
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White fprintf(lf, "/* : : generated by %s : : */\n", command);
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White fprintf(lf, "\n");
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White fprintf(lf, "#include \"lclib.h\"\n");
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White fprintf(lf, "#include \"lclang.h\"\n");
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White fprintf(lf, "\n");
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White while (s = fgets(buf, sizeof(buf), stdin))
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White {
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White line++;
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White while (isspace(*s))
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White s++;
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White if (!*s || *s == '#')
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White continue;
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White b = s;
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White vp = arg;
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White for (;;)
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White {
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White for (*vp++ = s; *s && !isspace(*s); s++);
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White if (!*s)
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White break;
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White for (*s++ = 0; isspace(*s); s++);
652485ad88d2a42f827c7e355220efeb3b2e37afLiam P. White if (!strcmp(*(vp - 1), "-"))
359a38ce40498397028473d956691915ed3e849atavmjong-free *(vp - 1) = 0;
359a38ce40498397028473d956691915ed3e849atavmjong-free if (!*s || vp >= ve)
359a38ce40498397028473d956691915ed3e849atavmjong-free break;
359a38ce40498397028473d956691915ed3e849atavmjong-free }
359a38ce40498397028473d956691915ed3e849atavmjong-free while (vp < ve)
359a38ce40498397028473d956691915ed3e849atavmjong-free *vp++ = 0;
359a38ce40498397028473d956691915ed3e849atavmjong-free if (*arg[0] == ':')
359a38ce40498397028473d956691915ed3e849atavmjong-free {
359a38ce40498397028473d956691915ed3e849atavmjong-free if (!strcmp(arg[0], ":map:"))
359a38ce40498397028473d956691915ed3e849atavmjong-free {
359a38ce40498397028473d956691915ed3e849atavmjong-free if (type != TERRITORY)
359a38ce40498397028473d956691915ed3e849atavmjong-free {
fprintf(stderr, "%s: %d: %s: must be specified after :territory:\n", command, line, arg[0]);
return 1;
}
type = MAP;
continue;
}
else if (!strcmp(arg[0], ":charset:"))
{
if (type != INIT)
{
fprintf(stderr, "%s: %d: %s must be specified first\n", command, line, arg[0]);
return 1;
}
type = CHARSET;
continue;
}
else if (!strcmp(arg[0], ":territory:"))
{
if (type != LANGUAGE)
{
fprintf(stderr, "%s: %d: %s: must be specified after :language:\n", command, line, arg[0]);
return 1;
}
type = TERRITORY;
continue;
}
else if (!strcmp(arg[0], ":language:"))
{
if (type != CHARSET)
{
fprintf(stderr, "%s: %d: %s must be specified after :charset:\n", command, line, arg[0]);
return 1;
}
type = LANGUAGE;
continue;
}
else
{
fprintf(stderr, "%s: %d: %s invalid\n", command, line, arg[0]);
return 1;
}
}
if (!arg[1])
{
fprintf(stderr, "%s: %d: at least two arguments expected\n", command, line);
return 1;
}
switch (type)
{
case CHARSET:
if (!(cp = newof(0, Charset_t, 1, s - b + 1)))
{
fprintf(stderr, "%s: %d: out of space\n", command, line);
return 1;
}
b = (char*)(cp + 1);
cp->link.code = copy(&b, arg[0]);
cp->alternates = copy(&b, arg[1]);
cp->ms = copy(&b, arg[2]);
if (cp != (Charset_t*)enter(&state.charset, (Link_t*)cp))
{
fprintf(stderr, "%s: %d: %s: duplicate charset\n", command, line, cp->link.code);
return 1;
}
break;
case TERRITORY:
if (!(tp = newof(0, Territory_t, 1, s - b + 1)))
{
fprintf(stderr, "%s: %d: out of space\n", command, line);
return 1;
}
b = (char*)(tp + 1);
tp->link.code = copy(&b, arg[0]);
tp->name = copy(&b, arg[1]);
tp->languages = 0;
if (s = copy(&b, arg[2]))
{
i = 0;
while (*(b = s))
{
for (; *s && *s != ':' && *s != '|'; s++);
if (c = *s)
*s++ = 0;
if (!(lp = (Language_t*)lookup(&state.language, b)))
{
fprintf(stderr, "%s: %d: %s: unknown language\n", command, line, b);
return 1;
}
if (!(ll = newof(0, Language_list_t, 1, 0)))
{
fprintf(stderr, "%s: %d: out of space\n", command, line);
return 1;
}
if (!tp->languages)
tp->languages = ll;
else
lz->next = ll;
lz = ll;
ll->language = lp;
ll->next = 0;
i++;
if (c == ':')
{
for (b = s; *s && *s != '|'; s++);
if (*s)
*s++ = 0;
if (!strcmp(b, "primary"))
tp->primary = 1;
}
}
if (territory_language_max < i)
territory_language_max = i;
}
if (tp != (Territory_t*)enter(&state.territory, (Link_t*)tp))
{
fprintf(stderr, "%s: %d: %s: duplicate territory\n", command, line, tp->link.code);
return 1;
}
break;
case LANGUAGE:
if (!(lp = newof(0, Language_t, 1, s - b + 1)))
{
fprintf(stderr, "%s: %d: out of space\n", command, line);
return 1;
}
b = (char*)(lp + 1);
lp->link.code = copy(&b, arg[0]);
lp->name = copy(&b, arg[1]);
lp->alternates = copy(&b, arg[2]);
if (!arg[3])
lp->charset = 0;
else if (!(lp->charset = (Charset_t*)lookup(&state.charset, arg[3])))
{
fprintf(stderr, "%s: %d: %s: unknown charset\n", command, line, arg[3]);
return 1;
}
lp->attributes = 0;
if (s = copy(&b, arg[4]))
{
i = 0;
fprintf(lf, "\nconst Lc_attribute_t attribute_%s[] =\n{\n", lp->link.code);
while (*(b = s))
{
for (f = 0; *s && *s != '|'; s++)
if (*s == ':')
{
*s++ = 0;
f = s;
}
if (*s)
*s++ = 0;
fprintf(lf, "{\"%s\",", b);
if (f)
fprintf(lf, "LC_%s,", f);
else
fprintf(lf, "0,");
if (!(ap = newof(0, Attribute_t, 1, 0)))
{
fprintf(stderr, "%s: %d: out of space\n", command, line);
return 1;
}
ap->link.code = b;
ap->link.index = i++;
if (!(al = newof(0, Attribute_list_t, 1, 0)))
{
fprintf(stderr, "%s: %d: out of space\n", command, line);
return 1;
}
if (!lp->attributes)
lp->attributes = al;
else
az->next = al;
az = al;
al->attribute = ap;
al->next = 0;
macro(lf, "SUBLANG", lp->name, b);
fprintf(lf, "\n},\n");
}
if (language_attribute_max < i)
language_attribute_max = i;
fprintf(lf, "};\n");
}
if (lp != (Language_t*)enter(&state.language, (Link_t*)lp))
{
fprintf(stderr, "%s: %d: %s: duplicate language\n", command, line, lp->link.code);
return 1;
}
break;
case MAP:
if (!(mp = newof(0, Map_t, 1, s - b + 1)))
{
fprintf(stderr, "%s: %d: out of space\n", command, line);
return 1;
}
b = (char*)(mp + 1);
mp->link.code = copy(&b, arg[0]);
if (!arg[2])
{
fprintf(stderr, "%s: %d: territory code expected\n", command, line);
return 1;
}
if (!(mp->language = (Language_t*)lookup(&state.language, arg[1])))
{
fprintf(stderr, "%s: %d: %s: unknown language\n", command, line, arg[1]);
return 1;
}
if (!(mp->territory = (Territory_t*)lookup(&state.territory, arg[2])))
{
fprintf(stderr, "%s: %d: %s: unknown territory\n", command, line, arg[2]);
return 1;
}
if (!arg[3])
mp->charset = 0;
else if (!(mp->charset = (Charset_t*)lookup(&state.charset, arg[3])))
{
fprintf(stderr, "%s: %d: %s: unknown charset\n", command, line, arg[3]);
return 1;
}
mp->attribute = 0;
if (arg[4])
{
for (al = mp->language->attributes; al; al = al->next)
if (!strcmp(al->attribute->link.code, arg[4]))
{
mp->attribute = al->attribute;
break;
}
if (!mp->attribute)
{
fprintf(stderr, "%s: %d: %s: unknown attribute\n", command, line, arg[4]);
return 1;
}
}
if (mp != (Map_t*)enter(&state.map, (Link_t*)mp))
{
fprintf(stderr, "%s: %d: %s: duplicate map\n", command, line, mp->link.code);
return 1;
}
break;
}
}
if (!language_attribute_max)
language_attribute_max = 1;
if (!territory_language_max)
territory_language_max = 1;
fprintf(hf, "\n#define LC_language_attribute_max\t%d\n", language_attribute_max);
fprintf(hf, "#define LC_territory_language_max\t%d\n", territory_language_max);
fprintf(hf, "\nstruct Lc_s;\n");
fprintf(hf, "\ntypedef struct Lc_info_s\n{\n");
fprintf(hf, "\tconst struct Lc_s*\tlc;\n");
fprintf(hf, "\tunsigned long\t\tnumber;\n");
fprintf(hf, "\tvoid*\t\t\tdata;\n");
fprintf(hf, "} Lc_info_t;\n");
fprintf(hf, "\ntypedef struct Lc_attribute_s\n{\n");
fprintf(hf, "\tconst char*\t\tname;\n");
fprintf(hf, "\tunsigned long\t\tflags;\n");
fprintf(hf, "\tunsigned long\t\tindex;\n");
fprintf(hf, "} Lc_attribute_t;\n");
fprintf(hf, "\ntypedef struct Lc_charset_s\n{\n");
fprintf(hf, "\tconst char*\t\tcode;\n");
fprintf(hf, "\tconst char*\t\talternates;\n");
fprintf(hf, "\tconst char*\t\tms;\n");
fprintf(hf, "\tunsigned long\t\tindex;\n");
fprintf(hf, "} Lc_charset_t;\n");
fprintf(hf, "\ntypedef struct Lc_language_s\n{\n");
fprintf(hf, "\tconst char*\t\tcode;\n");
fprintf(hf, "\tconst char*\t\tname;\n");
fprintf(hf, "\tconst char*\t\talternates;\n");
fprintf(hf, "\tconst Lc_charset_t*\tcharset;\n");
fprintf(hf, "\tunsigned long\t\tflags;\n");
fprintf(hf, "\tunsigned long\t\tindex;\n");
fprintf(hf, "\tconst Lc_attribute_t*\tattributes[LC_language_attribute_max];\n");
fprintf(hf, "} Lc_language_t;\n");
fprintf(hf, "\ntypedef struct Lc_territory_s\n{\n");
fprintf(hf, "\tconst char*\t\tcode;\n");
fprintf(hf, "\tconst char*\t\tname;\n");
fprintf(hf, "\tunsigned long\t\tflags;\n");
fprintf(hf, "\tunsigned long\t\tindex;\n");
fprintf(hf, "\tconst Lc_language_t*\tlanguages[LC_territory_language_max];\n");
fprintf(hf, "#ifdef _LC_TERRITORY_PRIVATE_\n");
fprintf(hf, "\t_LC_TERRITORY_PRIVATE_\n");
fprintf(hf, "#endif\n");
fprintf(hf, "} Lc_territory_t;\n");
fprintf(hf, "\ntypedef struct Lc_map_s\n{\n");
fprintf(hf, "\tconst char*\t\tcode;\n");
fprintf(hf, "\tconst Lc_language_t*\tlanguage;\n");
fprintf(hf, "\tconst Lc_territory_t*\tterritory;\n");
fprintf(hf, "\tconst Lc_charset_t*\tcharset;\n");
fprintf(hf, "\tconst Lc_attribute_t*\tattribute;\n");
fprintf(hf, "} Lc_map_t;\n");
fprintf(hf, "\ntypedef struct Lc_attribute_list_s\n{\n");
fprintf(hf, "\tstruct Lc_attribute_list_s*\tnext;\n");
fprintf(hf, "\tconst Lc_attribute_t*\t\tattribute;\n");
fprintf(hf, "} Lc_attribute_list_t;\n");
fprintf(hf, "\ntypedef struct Lc_s\n{\n");
fprintf(hf, "\tconst char*\t\tname;\n");
fprintf(hf, "\tconst char*\t\tcode;\n");
fprintf(hf, "\tconst Lc_language_t*\tlanguage;\n");
fprintf(hf, "\tconst Lc_territory_t*\tterritory;\n");
fprintf(hf, "\tconst Lc_charset_t*\tcharset;\n");
fprintf(hf, "\tconst Lc_attribute_list_t*\tattributes;\n");
fprintf(hf, "\tunsigned long\t\tflags;\n");
fprintf(hf, "\tunsigned long\t\tindex;\n");
fprintf(hf, "#ifdef _LC_PRIVATE_\n");
fprintf(hf, "\t_LC_PRIVATE_\n");
fprintf(hf, "#endif\n");
fprintf(hf, "} Lc_t;\n");
fprintf(hf, "\nstruct Lc_category_s;\n");
fprintf(hf, "\ntypedef int (*Lc_category_set_f)(struct Lc_category_s*);\n");
fprintf(hf, "\ntypedef struct Lc_category_s\n{\n");
fprintf(hf, "\tconst char*\t\tname;\n");
fprintf(hf, "\tint\t\t\texternal;\n");
fprintf(hf, "\tint\t\t\tinternal;\n");
fprintf(hf, "\tLc_category_set_f\tsetf;\n");
fprintf(hf, "\tLc_t*\t\t\tprev;\n");
fprintf(hf, "\tunsigned int\t\tflags;\n");
fprintf(hf, "} Lc_category_t;\n");
fprintf(hf, "\n");
fprintf(hf, "#if _BLD_ast && defined(__EXPORT__)\n");
fprintf(hf, "#define extern\t\t__EXPORT__\n");
fprintf(hf, "#endif\n");
fprintf(hf, "\n");
fprintf(hf, "extern size_t\t\tlccanon(Lc_t*, unsigned long flags, char*, size_t);\n");
fprintf(hf, "extern Lc_category_t*\tlccategories(void);\n");
fprintf(hf, "extern int\t\tlcindex(int, int);\n");
fprintf(hf, "extern Lc_info_t*\tlcinfo(int);\n");
fprintf(hf, "extern Lc_t*\t\tlcmake(const char*);\n");
fprintf(hf, "extern Lc_t*\t\tlcscan(Lc_t*);\n");
fprintf(hf, "\n");
fprintf(hf, "#undef\textern\n");
fprintf(lf, "\nconst Lc_charset_t lc_charsets[] =\n{\n");
for (cp = (Charset_t*)state.charset.root; cp; cp = (Charset_t*)cp->link.next)
{
fprintf(lf, "{\"%s\",", cp->link.code);
if (cp->alternates)
fprintf(lf, "\"%s\",", cp->alternates);
else
fprintf(lf, "0,");
if (cp->ms)
fprintf(lf, "\"%s\",", cp->ms);
else
fprintf(lf, "0");
fprintf(lf, "},\n");
}
fprintf(lf, "\t0\n};\n");
fprintf(lf, "\nconst Lc_language_t lc_languages[] =\n{\n");
fprintf(lf, "{\"C\",\"C\",\"POSIX\",&lc_charsets[0],LC_default,0,");
for (i = 0; i < language_attribute_max; i++)
fprintf(lf, "0,");
fprintf(lf, "},\n");
fprintf(lf, "{\"debug\",\"debug\",0,&lc_charsets[0],LC_debug,0,");
for (i = 0; i < language_attribute_max; i++)
fprintf(lf, "0,");
fprintf(lf, "},\n");
for (lp = (Language_t*)state.language.root; lp; lp = (Language_t*)lp->link.next)
{
fprintf(lf, "{\"%s\",\"%s\",", lp->link.code, lp->name);
if (lp->alternates)
fprintf(lf, "\"%s\",", lp->alternates);
else
fprintf(lf, "0,");
fprintf(lf, "&lc_charsets[%d],0,", lp->charset ? lp->charset->link.index : 0);
macro(lf, "LANG", lp->name, (char*)0);
for (i = 0, al = lp->attributes; al; al = al->next, i++)
fprintf(lf, "&attribute_%s[%d],", lp->link.code, al->attribute->link.index);
for (; i < language_attribute_max; i++)
fprintf(lf, "0,");
fprintf(lf, "\n},\n");
}
fprintf(lf, "\t0\n};\n");
fprintf(lf, "\nconst Lc_territory_t lc_territories[] =\n{\n");
fprintf(lf, "{\"C\",\"C\",LC_default,0,&lc_languages[0],");
for (i = 1; i < 2 * territory_language_max; i++)
fprintf(lf, "0,");
fprintf(lf, "},\n");
fprintf(lf, "{\"debug\",\"debug\",LC_debug,0,&lc_languages[1],");
for (i = 1; i < 2 * territory_language_max; i++)
fprintf(lf, "0,");
fprintf(lf, "},\n");
fprintf(lf, "{\"eu\",\"euro\",0,0,&lc_languages[0],");
for (i = 1; i < 2 * territory_language_max; i++)
fprintf(lf, "0,");
fprintf(lf, "},\n");
for (tp = (Territory_t*)state.territory.root; tp; tp = (Territory_t*)tp->link.next)
{
fprintf(lf, "{\"%s\",\"%s\",", tp->link.code, tp->name);
if (tp->primary)
fprintf(lf, "LC_primary,");
else
fprintf(lf, "0,");
macro(lf, "CTRY", tp->name, (char*)0);
for (i = 0, ll = tp->languages; ll; ll = ll->next, i++)
fprintf(lf, "&lc_languages[%d],", ll->language->link.index);
for (; i < territory_language_max; i++)
fprintf(lf, "0,");
for (i = 0, ll = tp->languages; ll; ll = ll->next, i++)
macro(lf, "SUBLANG", ll->language->name, tp->name);
for (; i < territory_language_max; i++)
fprintf(lf, "0,");
fprintf(lf, "\n},\n");
}
fprintf(lf, "\t0\n};\n");
fprintf(lf, "\nconst Lc_map_t lc_maps[] =\n{\n");
for (mp = (Map_t*)state.map.root; mp; mp = (Map_t*)mp->link.next)
{
fprintf(lf, "{\"%s\",", mp->link.code);
fprintf(lf, "&lc_languages[%d],", mp->language->link.index);
fprintf(lf, "&lc_territories[%d],", mp->territory->link.index);
fprintf(lf, "&lc_charsets[%d],", mp->charset ? mp->charset->link.index : 0);
if (mp->attribute)
fprintf(lf, "&attribute_%s[%d]", mp->language->link.code, mp->attribute->link.index);
else
fprintf(lf, "0");
fprintf(lf, "},\n");
}
fprintf(lf, "\t0\n};\n");
fclose(lf);
fprintf(hf, "\n#endif\n");
fclose(hf);
return 0;
}