117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/**
217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat***     Build a deterministic finite automaton to associate CCSIDs with
317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat***             character set names.
417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat***
517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat***     Compile on OS/400 with options SYSIFCOPT(*IFSIO).
617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat***
717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat***     See Copyright for the status of this software.
817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat***
917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat***     Author: Patrick Monnerat <pm@datasphere.ch>, DATASPHERE S.A.
1017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat**/
1117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
1217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#include <stdio.h>
1317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#include <errno.h>
1417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#include <stdlib.h>
1517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#include <string.h>
1617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#include <fcntl.h>
1717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#include <ctype.h>
1817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
1917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#include <iconv.h>
2017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
2117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
2217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#ifdef OLDXML
2317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#include "xml.h"
2417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#else
2517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#include <libxml/hash.h>
2617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#include <libxml/parser.h>
2717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#include <libxml/xpath.h>
2817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#include <libxml/xpathInternals.h>
2917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#endif
3017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
3117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
3217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#ifdef __OS400__
3317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#define iconv_open_error(cd)            ((cd).return_value == -1)
3417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#define set_iconv_open_error(cd)        ((cd).return_value = -1)
3517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#else
3617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#define iconv_open_error(cd)            ((cd) == (iconv_t) -1)
3717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#define set_iconv_open_error(cd)        ((cd) = (iconv_t) -1)
3817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#endif
3917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
4017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
4117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#define C_SOURCE_CCSID          500
4217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#define C_UTF8_CCSID            1208
4317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
4417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
4517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#define UTF8_SPACE      0x20
4617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#define UTF8_HT         0x09
4717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#define UTF8_0          0x30
4817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#define UTF8_9          0x39
4917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#define UTF8_A          0x41
5017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#define UTF8_Z          0x5A
5117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#define UTF8_a          0x61
5217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#define UTF8_z          0x7A
5317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
5417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
5517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#define GRANULE         128             /* Memory allocation granule. */
5617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
5717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#define EPSILON         0x100           /* Token for empty transition. */
5817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
5917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
6017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#ifndef OFFSETOF
6117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#define OFFSETOF(t, f)  ((unsigned int) ((char *) &((t *) 0)->f - (char *) 0))
6217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#endif
6317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
6417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#ifndef OFFSETBY
6517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#define OFFSETBY(t, p, o)       ((t *) ((char *) (p) + (unsigned int) (o)))
6617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#endif
6717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
6817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
6917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerattypedef struct t_transition     t_transition;   /* NFA/DFA transition. */
7017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerattypedef struct t_state          t_state;        /* NFA/DFA state node. */
7117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerattypedef struct t_symlist        t_symlist;      /* Symbol (i.e.: name) list. */
7217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerattypedef struct t_chset          t_chset;        /* Character set. */
7317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerattypedef struct t_stategroup     t_stategroup;   /* Optimization group. */
7417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerattypedef unsigned char           utf8char;       /* UTF-8 character byte. */
7517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerattypedef unsigned char           byte;           /* Untyped data byte. */
7617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
7717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
7817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerattypedef struct {                        /* Set of pointers. */
7917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int    p_size;         /* Current allocated size. */
8017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int    p_card;         /* Current element count. */
8117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        void *          p_set[1];       /* Element array. */
8217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}               t_powerset;
8317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
8417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
8517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstruct t_transition {
8617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_transition *  t_forwprev;     /* Head of forward transition list. */
8717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_transition *  t_forwnext;     /* Tail of forward transition list. */
8817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_transition *  t_backprev;     /* Head of backward transition list. */
8917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_transition *  t_backnext;     /* Tail of backward transition list. */
9017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state *       t_from;         /* Incoming state. */
9117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state *       t_to;           /* Destination state. */
9217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned short  t_token;        /* Transition token. */
9317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int    t_index;        /* Transition array index. */
9417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat};
9517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
9617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
9717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstruct t_state {
9817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state *       s_next;         /* Next state (for DFA construction). */
9917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state *       s_stack;        /* Unprocessed DFA states stack. */
10017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_transition *  s_forward;      /* Forward transitions. */
10117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_transition *  s_backward;     /* Backward transitions. */
10217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_chset *       s_final;        /* Recognized character set. */
10317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_powerset *    s_nfastates;    /* Corresponding NFA states. */
10417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int    s_index;        /* State index. */
10517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat};
10617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
10717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
10817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstruct t_symlist {
10917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_symlist *     l_next;         /* Next name in list. */
11017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        utf8char        l_symbol[1];    /* Name bytes. */
11117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat};
11217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
11317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
11417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstruct t_chset {
11517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_chset *       c_next;         /* Next character set. */
11617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_symlist *     c_names;        /* Character set name list. */
11717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        iconv_t         c_fromUTF8;     /* Conversion from UTF-8. */
11817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int    c_ccsid;        /* IBM character set code. */
11917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int    c_mibenum;      /* IANA character code. */
12017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat};
12117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
12217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
12317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstruct t_stategroup {
12417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_stategroup *  g_next;         /* Next group. */
12517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state *       g_member;       /* Group member (s_stack) list. */
12617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int    g_id;           /* Group ident. */
12717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat};
12817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
12917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
13017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
13117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratt_chset *       chset_list;             /* Character set list. */
13217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratt_state *       initial_state;          /* Initial NFA state. */
13317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneraticonv_t         job2utf8;               /* Job CCSID to UTF-8 conversion. */
13417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneraticonv_t         utf82job;               /* UTF-8 to job CCSID conversion. */
13517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratt_state *       dfa_states;             /* List of DFA states. */
13617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratunsigned int    groupid;                /* Group ident counter. */
13717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
13817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
13917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/**
14017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat***     UTF-8 strings.
14117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat**/
14217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
14317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#pragma convert(819)
14417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
14517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_MIBenum[] = "MIBenum";
14617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_mibenum[] = "mibenum";
14717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_ibm_[] = "ibm-";
14817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_IBMCCSID[] = "IBMCCSID";
14917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_iana_[] = "iana-";
15017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_Name[] = "Name";
15117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_Pref_MIME_Name[] = "Preferred MIME Name";
15217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_Aliases[] = "Aliases";
15317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_html[] = "html";
15417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_htmluri[] = "http://www.w3.org/1999/xhtml";
15517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_A[] = "A";
15617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_C[] = "C";
15717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_M[] = "M";
15817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_N[] = "N";
15917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_P[] = "P";
16017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_T[] = "T";
16117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_ccsid[] = "ccsid";
16217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_EBCDIC[] = "EBCDIC";
16317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_ASCII[] = "ASCII";
16417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_assocnodes[] = "/ccsid_mibenum/assoc[@ccsid]";
16517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_aliastext[] =
16617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                "/ccsid_mibenum/assoc[@ccsid=$C]/alias/text()";
16717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#ifdef OLDXML
16817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_tablerows[] =
16917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        "//table[@id='table-character-sets-1']/*/tr";
17017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_headerpos[] =
17117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                "count(th[text()=$T]/preceding-sibling::th)+1";
17217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_getmibenum[] = "number(td[$M])";
17317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_getprefname[] = "string(td[$P])";
17417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_getname[] = "string(td[$N])";
17517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_getaliases[] = "td[$A]/text()";
17617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#else
17717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_tablerows[] =
17817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        "//html:table[@id='table-character-sets-1']/*/html:tr";
17917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_headerpos[] =
18017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                "count(html:th[text()=$T]/preceding-sibling::html:th)+1";
18117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_getmibenum[] = "number(html:td[$M])";
18217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_getprefname[] = "string(html:td[$P])";
18317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_getname[] = "string(html:td[$N])";
18417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic const utf8char   utf8_getaliases[] = "html:td[$A]/text()";
18517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#endif
18617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
18717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#pragma convert(0)
18817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
18917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
19017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/**
19117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat***     UTF-8 character length table.
19217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat***
19317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat***     Index is first character byte, value is the character byte count.
19417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat**/
19517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
19617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic signed char      utf8_chlen[] = {
19717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* 00-07 */     1,      1,      1,      1,      1,      1,      1,      1,
19817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* 08-0F */     1,      1,      1,      1,      1,      1,      1,      1,
19917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* 10-17 */     1,      1,      1,      1,      1,      1,      1,      1,
20017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* 18-1F */     1,      1,      1,      1,      1,      1,      1,      1,
20117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* 20-27 */     1,      1,      1,      1,      1,      1,      1,      1,
20217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* 28-2F */     1,      1,      1,      1,      1,      1,      1,      1,
20317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* 30-37 */     1,      1,      1,      1,      1,      1,      1,      1,
20417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* 38-3F */     1,      1,      1,      1,      1,      1,      1,      1,
20517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* 40-47 */     1,      1,      1,      1,      1,      1,      1,      1,
20617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* 48-4F */     1,      1,      1,      1,      1,      1,      1,      1,
20717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* 50-57 */     1,      1,      1,      1,      1,      1,      1,      1,
20817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* 58-5F */     1,      1,      1,      1,      1,      1,      1,      1,
20917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* 60-67 */     1,      1,      1,      1,      1,      1,      1,      1,
21017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* 68-6F */     1,      1,      1,      1,      1,      1,      1,      1,
21117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* 70-77 */     1,      1,      1,      1,      1,      1,      1,      1,
21217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* 78-7F */     1,      1,      1,      1,      1,      1,      1,      1,
21317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* 80-87 */     -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
21417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* 88-8F */     -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
21517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* 90-97 */     -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
21617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* 98-9F */     -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
21717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* A0-A7 */     -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
21817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* A8-AF */     -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
21917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* B0-B7 */     -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
22017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* B8-BF */     -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
22117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* C0-C7 */     2,      2,      2,      2,      2,      2,      2,      2,
22217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* C8-CF */     2,      2,      2,      2,      2,      2,      2,      2,
22317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* D0-D7 */     2,      2,      2,      2,      2,      2,      2,      2,
22417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* D8-DF */     2,      2,      2,      2,      2,      2,      2,      2,
22517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* E0-E7 */     3,      3,      3,      3,      3,      3,      3,      3,
22617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* E8-EF */     3,      3,      3,      3,      3,      3,      3,      3,
22717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* F0-F7 */     4,      4,      4,      4,      4,      4,      4,      4,
22817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat/* F8-FF */     5,      5,      5,      5,      6,      6,      -1,     -1
22917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat};
23017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
23117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
23217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
23317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratvoid
23417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratchknull(void * p)
23517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
23617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
23717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (p)
23817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                return;
23917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
24017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(stderr, "Not enough memory\n");
24117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        exit(1);
24217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
24317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
24417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
24517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratvoid
24617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratmakecode(char * buf, unsigned int ccsid)
24717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
24817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
24917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ccsid &= 0xFFFF;
25017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        memset(buf, 0, 32);
25117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        sprintf(buf, "IBMCCSID%05u0000000", ccsid);
25217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
25317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
25417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
25517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneraticonv_t
25617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneraticonv_open_ccsid(unsigned int ccsidout,
25717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                unsigned int ccsidin, unsigned int nullflag)
25817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
25917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
26017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        char fromcode[33];
26117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        char tocode[33];
26217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
26317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        makecode(fromcode, ccsidin);
26417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        makecode(tocode, ccsidout);
26517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        memset(tocode + 13, 0, sizeof tocode - 13);
26617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
26717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (nullflag)
26817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                fromcode[18] = '1';
26917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
27017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return iconv_open(tocode, fromcode);
27117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
27217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
27317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
27417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratunsigned int
27517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratgetnum(char * * cpp)
27617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
27717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
27817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int n;
27917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        char * cp;
28017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
28117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        cp = *cpp;
28217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        n = 0;
28317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
28417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        while (isdigit(*cp))
28517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                n = 10 * n + *cp++ - '0';
28617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
28717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        *cpp = cp;
28817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return n;
28917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
29017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
29117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
29217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratconst utf8char *
29317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick MonnerathashBinaryKey(const byte * bytes, unsigned int len)
29417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
29517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
29617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        const byte * bp;
29717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        utf8char * key;
29817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        utf8char * cp;
29917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int n;
30017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int n4;
30117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int i;
30217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
30317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
30417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Encode binary data in character form to be used as hash
30517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***             table key.
30617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
30717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
30817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        n = (4 * len + 2) / 3;
30917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        key = (utf8char *) malloc(n + 1);
31017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        chknull(key);
31117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        bp = bytes;
31217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        cp = key;
31317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
31417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (n4 = n >> 2; n4; n4--) {
31517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                i = (bp[0] << 16) | (bp[1] << 8) | bp[2];
31617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                *cp++ = 0x21 + ((i >> 18) & 0x3F);
31717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                *cp++ = 0x21 + ((i >> 12) & 0x3F);
31817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                *cp++ = 0x21 + ((i >> 6) & 0x3F);
31917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                *cp++ = 0x21 + (i & 0x3F);
32017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                bp += 3;
32117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
32217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
32317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        switch (n & 0x3) {
32417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
32517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        case 2:
32617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                *cp++ = 0x21 + ((*bp >> 2) & 0x3F);
32717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                *cp++ = 0x21 + ((*bp << 4) & 0x3F);
32817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                break;
32917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
33017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        case 3:
33117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                i = (bp[0] << 8) | bp[1];
33217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                *cp++ = 0x21 + ((i >> 10) & 0x3F);
33317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                *cp++ = 0x21 + ((i >> 4) & 0x3F);
33417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                *cp++ = 0x21 + ((i << 2) & 0x3F);
33517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                break;
33617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
33717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
33817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        *cp = '\0';
33917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return key;
34017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
34117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
34217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
34317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratvoid *
34417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerathash_get(xmlHashTablePtr h, const void * binkey, unsigned int len)
34517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
34617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
34717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        const utf8char * key;
34817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        void * result;
34917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
35017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        key = hashBinaryKey((const byte *) binkey, len);
35117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        result = xmlHashLookup(h, key);
35217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        free((char *) key);
35317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return result;
35417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
35517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
35617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
35717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratint
35817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerathash_add(xmlHashTablePtr h, const void * binkey, unsigned int len, void * data)
35917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
36017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
36117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        const utf8char * key;
36217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        int result;
36317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
36417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        key = hashBinaryKey((const byte *) binkey, len);
36517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        result = xmlHashAddEntry(h, key, data);
36617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        free((char *) key);
36717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return result;
36817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
36917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
37017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
37117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick MonneratxmlDocPtr
37217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick MonneratloadXMLFile(const char * filename)
37317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
37417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
37517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        struct stat sbuf;
37617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        byte * databuf;
37717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        int fd;
37817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        int i;
37917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlDocPtr doc;
38017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
38117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (stat(filename, &sbuf))
38217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                return (xmlDocPtr) NULL;
38317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
38417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        databuf = malloc(sbuf.st_size + 4);
38517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
38617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (!databuf)
38717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                return (xmlDocPtr) NULL;
38817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
38917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fd = open(filename, O_RDONLY
39017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#ifdef O_BINARY
39117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                         | O_BINARY
39217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#endif
39317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                                        );
39417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
39517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (fd < 0) {
39617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                free((char *) databuf);
39717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                return (xmlDocPtr) NULL;
39817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
39917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
40017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        i = read(fd, (char *) databuf, sbuf.st_size);
40117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        close(fd);
40217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
40317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (i != sbuf.st_size) {
40417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                free((char *) databuf);
40517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                return (xmlDocPtr) NULL;
40617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
40717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
40817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        databuf[i] = databuf[i + 1] = databuf[i + 2] = databuf[i + 3] = 0;
40917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        doc = xmlParseMemory((xmlChar *) databuf, i);
41017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        free((char *) databuf);
41117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return doc;
41217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
41317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
41417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
41517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratint
41617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratmatch(char * * cpp, char * s)
41717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
41817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
41917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        char * cp;
42017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        int c1;
42117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        int c2;
42217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
42317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        cp = *cpp;
42417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
42517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (cp = *cpp; c2 = *s++; cp++) {
42617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                c1 = *cp;
42717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
42817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (c1 != c2) {
42917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        if (isupper(c1))
43017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                c1 = tolower(c1);
43117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
43217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        if (isupper(c2))
43317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                c2 = tolower(c2);
43417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
43517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
43617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (c1 != c2)
43717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        return 0;
43817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
43917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
44017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        c1 = *cp;
44117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
44217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        while (c1 == ' ' || c1 == '\t')
44317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                c1 = *++cp;
44417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
44517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        *cpp = cp;
44617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return 1;
44717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
44817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
44917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
45017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratt_state *
45117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratnewstate(void)
45217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
45317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
45417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state * s;
45517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
45617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        s = (t_state *) malloc(sizeof *s);
45717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        chknull(s);
45817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        memset((char *) s, 0, sizeof *s);
45917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return s;
46017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
46117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
46217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
46317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratvoid
46417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratunlink_transition(t_transition * t)
46517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
46617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
46717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (t->t_backnext)
46817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                t->t_backnext->t_backprev = t->t_backprev;
46917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
47017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (t->t_backprev)
47117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                t->t_backprev->t_backnext = t->t_backnext;
47217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        else if (t->t_to)
47317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                t->t_to->s_backward = t->t_backnext;
47417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
47517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (t->t_forwnext)
47617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                t->t_forwnext->t_forwprev = t->t_forwprev;
47717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
47817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (t->t_forwprev)
47917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                t->t_forwprev->t_forwnext = t->t_forwnext;
48017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        else if (t->t_from)
48117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                t->t_from->s_forward = t->t_forwnext;
48217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
48317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t->t_backprev = (t_transition *) NULL;
48417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t->t_backnext = (t_transition *) NULL;
48517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t->t_forwprev = (t_transition *) NULL;
48617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t->t_forwnext = (t_transition *) NULL;
48717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t->t_from = (t_state *) NULL;
48817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t->t_to = (t_state *) NULL;
48917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
49017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
49117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
49217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratvoid
49317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratlink_transition(t_transition * t, t_state * from, t_state * to)
49417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
49517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
49617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (!from)
49717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                from = t->t_from;
49817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
49917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (!to)
50017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                to = t->t_to;
50117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
50217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unlink_transition(t);
50317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
50417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if ((t->t_from = from)) {
50517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if ((t->t_forwnext = from->s_forward))
50617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        t->t_forwnext->t_forwprev = t;
50717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
50817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                from->s_forward = t;
50917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
51017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
51117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if ((t->t_to = to)) {
51217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if ((t->t_backnext = to->s_backward))
51317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        t->t_backnext->t_backprev = t;
51417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
51517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                to->s_backward = t;
51617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
51717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
51817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
51917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
52017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratt_transition *
52117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratnewtransition(unsigned int token, t_state * from, t_state * to)
52217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
52317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
52417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_transition * t;
52517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
52617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t = (t_transition *) malloc(sizeof *t);
52717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        chknull(t);
52817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        memset((char *) t, 0, sizeof *t);
52917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t->t_token = token;
53017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        link_transition(t, from, to);
53117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return t;
53217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
53317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
53417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
53517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratt_transition *
53617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratuniquetransition(unsigned int token, t_state * from, t_state * to)
53717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
53817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
53917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_transition * t;
54017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
54117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (t = from->s_forward; t; t = t->t_forwnext)
54217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (t->t_token == token && (t->t_to == to || !to))
54317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        return t;
54417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
54517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return to? newtransition(token, from, to): (t_transition *) NULL;
54617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
54717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
54817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
54917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratint
55017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratset_position(t_powerset * s, void * e)
55117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
55217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
55317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int l;
55417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int h;
55517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int m;
55617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        int i;
55717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
55817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        l = 0;
55917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        h = s->p_card;
56017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
56117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        while (l < h) {
56217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                m = (l + h) >> 1;
56317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
56417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                /**
56517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ***     If both pointers belong to different allocation arenas,
56617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ***             native comparison may find them neither
56717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ***             equal, nor greater, nor smaller.
56817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ***     We thus compare using memcmp() to get an orthogonal
56917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ***             result.
57017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                **/
57117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
57217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                i = memcmp(&e, s->p_set + m, sizeof e);
57317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
57417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (i < 0)
57517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        h = m;
57617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                else if (!i)
57717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        return m;
57817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                else
57917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        l = m + 1;
58017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
58117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
58217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return l;
58317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
58417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
58517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
58617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratt_powerset *
58717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratset_include(t_powerset * s, void * e)
58817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
58917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
59017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int pos;
59117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int n;
59217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
59317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (!s) {
59417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                s = (t_powerset *) malloc(sizeof *s +
59517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                    GRANULE * sizeof s->p_set);
59617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                chknull(s);
59717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                s->p_size = GRANULE;
59817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                s->p_set[GRANULE] = (t_state *) NULL;
59917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                s->p_set[0] = e;
60017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                s->p_card = 1;
60117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                return s;
60217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
60317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
60417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        pos = set_position(s, e);
60517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
60617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (pos < s->p_card && s->p_set[pos] == e)
60717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                return s;
60817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
60917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (s->p_card >= s->p_size) {
61017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                s->p_size += GRANULE;
61117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                s = (t_powerset *) realloc(s,
61217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                    sizeof *s + s->p_size * sizeof s->p_set);
61317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                chknull(s);
61417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                s->p_set[s->p_size] = (t_state *) NULL;
61517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
61617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
61717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        n = s->p_card - pos;
61817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
61917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (n)
62017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                memmove((char *) (s->p_set + pos + 1),
62117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                    (char *) (s->p_set + pos), n * sizeof s->p_set[0]);
62217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
62317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        s->p_set[pos] = e;
62417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        s->p_card++;
62517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return s;
62617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
62717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
62817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
62917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratt_state *
63017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratnfatransition(t_state * to, byte token)
63117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
63217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
63317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state * from;
63417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
63517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        from = newstate();
63617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        newtransition(token, from, to);
63717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return from;
63817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
63917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
64017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
64117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratstatic t_state *        nfadevelop(t_state * from, t_state * final, iconv_t icc,
64217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                const utf8char * name, unsigned int len);
64317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
64417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
64517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratvoid
64617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratnfaslice(t_state * * from, t_state * * to, iconv_t icc,
64717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                const utf8char * chr, unsigned int chlen,
64817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                const utf8char * name, unsigned int len, t_state * final)
64917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
65017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
65117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        char * srcp;
65217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        char * dstp;
65317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        size_t srcc;
65417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        size_t dstc;
65517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int cnt;
65617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state * f;
65717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state * t;
65817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_transition * tp;
65917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        byte bytebuf[8];
66017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
66117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        srcp = (char *) chr;
66217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        srcc = chlen;
66317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        dstp = (char *) bytebuf;
66417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        dstc = sizeof bytebuf;
66517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        iconv(icc, &srcp, &srcc, &dstp, &dstc);
66617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        dstp = (char *) bytebuf;
66717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        cnt = sizeof bytebuf - dstc;
66817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t = *to;
66917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        f = *from;
67017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
67117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
67217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Check for end of string.
67317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
67417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
67517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (!len)
67617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (t && t != final)
67717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        uniquetransition(EPSILON, t, final);
67817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                else
67917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        t = final;
68017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
68117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (f)
68217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                while (cnt) {
68317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        tp = uniquetransition(*dstp, f, (t_state *) NULL);
68417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
68517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        if (!tp)
68617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                break;
68717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
68817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        f = tp->t_to;
68917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        dstp++;
69017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        cnt--;
69117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
69217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
69317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (!cnt) {
69417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (!t)
69517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        t = nfadevelop(f, final, icc, name, len);
69617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
69717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                *to = t;
69817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                return;
69917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
70017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
70117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (!t) {
70217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                t = nfadevelop((t_state *) NULL, final, icc, name, len);
70317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                *to = t;
70417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
70517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
70617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (!f)
70717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                *from = f = newstate();
70817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
70917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        while (cnt > 1)
71017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                t = nfatransition(t, dstp[--cnt]);
71117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
71217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        newtransition(*dstp, f, t);
71317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
71417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
71517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
71617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratt_state *
71717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratnfadevelop(t_state * from, t_state * final, iconv_t icc,
71817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        const utf8char * name, unsigned int len)
71917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
72017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
72117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        int chlen;
72217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        int i;
72317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state * to;
72417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        int uccnt;
72517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        int lccnt;
72617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        utf8char chr;
72717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
72817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        chlen = utf8_chlen[*name];
72917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
73017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (i = 1; i < chlen; i++)
73117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if ((name[i] & 0xC0) != 0x80)
73217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        break;
73317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
73417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (i != chlen) {
73517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                fprintf(stderr,
73617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                    "Invalid UTF8 character in character set name\n");
73717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                return (t_state *) NULL;
73817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
73917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
74017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        to = (t_state *) NULL;
74117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        nfaslice(&from, &to,
74217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat            icc, name, chlen, name + chlen, len - chlen, final);
74317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
74417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (*name >= UTF8_a && *name <= UTF8_z)
74517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                chr = *name - UTF8_a + UTF8_A;
74617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        else if (*name >= UTF8_A && *name <= UTF8_Z)
74717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                chr = *name - UTF8_A + UTF8_a;
74817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        else
74917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                return from;
75017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
75117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        nfaslice(&from, &to, icc, &chr, 1, name + chlen, len - chlen, final);
75217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return from;
75317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
75417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
75517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
75617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
75717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratvoid
75817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratnfaenter(const utf8char * name, int len, t_chset * charset)
75917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
76017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
76117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_chset * s;
76217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state * final;
76317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state * sp;
76417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_symlist * lp;
76517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
76617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
76717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Enter case-insensitive `name' in NFA in all known
76817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***             character codes.
76917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Redundant shift state changes as well as shift state
77017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***             differences between uppercase and lowercase are
77117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***             not handled.
77217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
77317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
77417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (len < 0)
77517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                len = strlen(name) + 1;
77617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
77717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (lp = charset->c_names; lp; lp = lp->l_next)
77817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (!memcmp(name, lp->l_symbol, len))
77917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        return;         /* Already entered. */
78017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
78117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        lp = (t_symlist *) malloc(sizeof *lp + len);
78217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        chknull(lp);
78317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        memcpy(lp->l_symbol, name, len);
78417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        lp->l_symbol[len] = '\0';
78517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        lp->l_next = charset->c_names;
78617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        charset->c_names = lp;
78717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        final = newstate();
78817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        final->s_final = charset;
78917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
79017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (s = chset_list; s; s = s->c_next)
79117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (!iconv_open_error(s->c_fromUTF8))
79217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        sp = nfadevelop(initial_state, final,
79317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                            s->c_fromUTF8, name, len);
79417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
79517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
79617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
79717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratunsigned int
79817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratutf8_utostr(utf8char * s, unsigned int v)
79917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
80017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
80117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int d;
80217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int i;
80317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
80417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        d = v / 10;
80517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        v -= d * 10;
80617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        i = d? utf8_utostr(s, d): 0;
80717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        s[i++] = v + UTF8_0;
80817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        s[i] = '\0';
80917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return i;
81017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
81117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
81217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
81317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratunsigned int
81417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratutf8_utostrpad(utf8char * s, unsigned int v, int digits)
81517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
81617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
81717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int i = utf8_utostr(s, v);
81817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        utf8char pad = UTF8_SPACE;
81917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
82017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (digits < 0) {
82117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                pad = UTF8_0;
82217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                digits = -digits;
82317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
82417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
82517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (i >= digits)
82617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                return i;
82717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
82817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        memmove(s + digits - i, s, i + 1);
82917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        memset(s, pad, digits - i);
83017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return digits;
83117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
83217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
83317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
83417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratunsigned int
83517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratutf8_strtou(const utf8char * s)
83617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
83717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
83817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int v;
83917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
84017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        while (*s == UTF8_SPACE || *s == UTF8_HT)
84117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                s++;
84217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
84317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (v = 0; *s >= UTF8_0 && *s <= UTF8_9;)
84417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                v = 10 * v + *s++ - UTF8_0;
84517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
84617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return v;
84717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
84817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
84917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
85017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratunsigned int
85117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick MonneratgetNumAttr(xmlNodePtr node, const xmlChar * name)
85217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
85317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
85417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        const xmlChar * s;
85517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int val;
85617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
85717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        s = xmlGetProp(node, name);
85817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
85917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (!s)
86017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                return 0;
86117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
86217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        val = utf8_strtou(s);
86317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlFree((xmlChar *) s);
86417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return val;
86517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
86617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
86717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
86817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratvoid
86917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratread_assocs(const char * filename)
87017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
87117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
87217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlDocPtr doc;
87317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlXPathContextPtr ctxt;
87417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlXPathObjectPtr obj;
87517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlNodePtr node;
87617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_chset * sp;
87717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        int i;
87817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int ccsid;
87917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int mibenum;
88017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        utf8char symbuf[32];
88117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
88217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        doc = loadXMLFile(filename);
88317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
88417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (!doc) {
88517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                fprintf(stderr, "Cannot load file %s\n", filename);
88617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                exit(1);
88717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
88817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
88917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ctxt = xmlXPathNewContext(doc);
89017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        obj = xmlXPathEval(utf8_assocnodes, ctxt);
89117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
89217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (!obj || obj->type != XPATH_NODESET || !obj->nodesetval ||
89317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat            !obj->nodesetval->nodeTab || !obj->nodesetval->nodeNr) {
89417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                fprintf(stderr, "No association found in %s\n", filename);
89517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                exit(1);
89617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
89717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
89817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (i = 0; i < obj->nodesetval->nodeNr; i++) {
89917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                node = obj->nodesetval->nodeTab[i];
90017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ccsid = getNumAttr(node, utf8_ccsid);
90117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                mibenum = getNumAttr(node, utf8_mibenum);
90217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
90317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                /**
90417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ***     Check for duplicate.
90517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                **/
90617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
90717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                for (sp = chset_list; sp; sp = sp->c_next)
90817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        if (ccsid && ccsid == sp->c_ccsid ||
90917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                            mibenum && mibenum == sp->c_mibenum) {
91017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                fprintf(stderr, "Duplicate character set: ");
91117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                fprintf(stderr, "CCSID = %u/%u, ",
91217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                    ccsid, sp->c_ccsid);
91317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                fprintf(stderr, "MIBenum = %u/%u\n",
91417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                    mibenum, sp->c_mibenum);
91517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                break;
91617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                }
91717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
91817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (sp)
91917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        continue;
92017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
92117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                /**
92217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ***     Allocate the new character set.
92317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                **/
92417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
92517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                sp = (t_chset *) malloc(sizeof *sp);
92617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                chknull(sp);
92717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                memset(sp, 0, sizeof *sp);
92817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
92917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (!ccsid)     /* Do not attempt with current job CCSID. */
93017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        set_iconv_open_error(sp->c_fromUTF8);
93117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                else {
93217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        sp->c_fromUTF8 =
93317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                            iconv_open_ccsid(ccsid, C_UTF8_CCSID, 0);
93417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
93517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        if (iconv_open_error(sp->c_fromUTF8) == -1)
93617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                fprintf(stderr,
93717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                    "Cannot convert into CCSID %u: ignored\n",
93817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                    ccsid);
93917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
94017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
94117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                sp->c_ccsid = ccsid;
94217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                sp->c_mibenum = mibenum;
94317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                sp->c_next = chset_list;
94417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                chset_list = sp;
94517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
94617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
94717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlXPathFreeObject(obj);
94817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
94917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
95017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Enter aliases.
95117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
95217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
95317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (sp = chset_list; sp; sp = sp->c_next) {
95417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                strcpy(symbuf, utf8_ibm_);
95517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                utf8_utostr(symbuf + 4, sp->c_ccsid);
95617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                nfaenter(symbuf, -1, sp);
95717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                strcpy(symbuf, utf8_IBMCCSID);
95817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                utf8_utostrpad(symbuf + 8, sp->c_ccsid, -5);
95917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                nfaenter(symbuf, 13, sp);       /* Not null-terminated. */
96017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
96117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (sp->c_mibenum) {
96217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        strcpy(symbuf, utf8_iana_);
96317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        utf8_utostr(symbuf + 5, sp->c_mibenum);
96417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        nfaenter(symbuf, -1, sp);
96517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
96617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
96717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                xmlXPathRegisterVariable(ctxt, utf8_C,
96817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                    xmlXPathNewFloat((double) sp->c_ccsid));
96917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                obj = xmlXPathEval(utf8_aliastext, ctxt);
97017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
97117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (!obj || obj->type != XPATH_NODESET) {
97217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        fprintf(stderr, "getAlias failed in %s\n", filename);
97317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        exit(1);
97417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
97517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
97617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (obj->nodesetval &&
97717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                    obj->nodesetval->nodeTab && obj->nodesetval->nodeNr) {
97817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        for (i = 0; i < obj->nodesetval->nodeNr; i++) {
97917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                node = obj->nodesetval->nodeTab[i];
98017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                nfaenter(node->content, -1, sp);
98117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                }
98217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
98317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
98417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                xmlXPathFreeObject(obj);
98517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
98617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
98717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlXPathFreeContext(ctxt);
98817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlFreeDoc(doc);
98917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
99017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
99117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
99217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratunsigned int
99317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick MonneratcolumnPosition(xmlXPathContextPtr ctxt, const xmlChar * header)
99417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
99517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
99617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlXPathObjectPtr obj;
99717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int res = 0;
99817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
99917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlXPathRegisterVariable(ctxt, utf8_T, xmlXPathNewString(header));
100017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        obj = xmlXPathEval(utf8_headerpos, ctxt);
100117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
100217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (obj) {
100317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (obj->type == XPATH_NUMBER)
100417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        res = (unsigned int) obj->floatval;
100517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
100617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                xmlXPathFreeObject(obj);
100717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
100817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
100917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return res;
101017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
101117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
101217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
101317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratvoid
101417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratread_iana(const char * filename)
101517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
101617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
101717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlDocPtr doc;
101817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlXPathContextPtr ctxt;
101917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlXPathObjectPtr obj1;
102017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlXPathObjectPtr obj2;
102117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlNodePtr node;
102217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        int prefnamecol;
102317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        int namecol;
102417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        int mibenumcol;
102517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        int aliascol;
102617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        int mibenum;
102717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_chset * sp;
102817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        int n;
102917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        int i;
103017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
103117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        doc = loadXMLFile(filename);
103217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
103317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (!doc) {
103417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                fprintf(stderr, "Cannot load file %s\n", filename);
103517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                exit(1);
103617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
103717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
103817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ctxt = xmlXPathNewContext(doc);
103917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
104017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#ifndef OLDXML
104117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlXPathRegisterNs(ctxt, utf8_html, utf8_htmluri);
104217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat#endif
104317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
104417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        obj1 = xmlXPathEval(utf8_tablerows, ctxt);
104517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
104617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (!obj1 || obj1->type != XPATH_NODESET || !obj1->nodesetval ||
104717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat            !obj1->nodesetval->nodeTab || obj1->nodesetval->nodeNr <= 1) {
104817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                fprintf(stderr, "No data in %s\n", filename);
104917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                exit(1);
105017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
105117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
105217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
105317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Identify columns.
105417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
105517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
105617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlXPathSetContextNode(obj1->nodesetval->nodeTab[0], ctxt);
105717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        prefnamecol = columnPosition(ctxt, utf8_Pref_MIME_Name);
105817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        namecol = columnPosition(ctxt, utf8_Name);
105917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        mibenumcol = columnPosition(ctxt, utf8_MIBenum);
106017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        aliascol = columnPosition(ctxt, utf8_Aliases);
106117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
106217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (!prefnamecol || !namecol || !mibenumcol || !aliascol) {
106317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                fprintf(stderr, "Key column(s) missing in %s\n", filename);
106417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                exit(1);
106517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
106617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
106717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlXPathRegisterVariable(ctxt, utf8_P,
106817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat            xmlXPathNewFloat((double) prefnamecol));
106917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlXPathRegisterVariable(ctxt, utf8_N,
107017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat            xmlXPathNewFloat((double) namecol));
107117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlXPathRegisterVariable(ctxt, utf8_M,
107217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat            xmlXPathNewFloat((double) mibenumcol));
107317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlXPathRegisterVariable(ctxt, utf8_A,
107417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat            xmlXPathNewFloat((double) aliascol));
107517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
107617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
107717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Process each row.
107817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
107917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
108017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (n = 1; n < obj1->nodesetval->nodeNr; n++) {
108117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                xmlXPathSetContextNode(obj1->nodesetval->nodeTab[n], ctxt);
108217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
108317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                /**
108417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ***     Get the MIBenum from current row.
108517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                */
108617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
108717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                obj2 = xmlXPathEval(utf8_getmibenum, ctxt);
108817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
108917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (!obj2 || obj2->type != XPATH_NUMBER) {
109017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        fprintf(stderr, "get MIBenum failed at row %u\n", n);
109117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        exit(1);
109217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
109317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
109417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (xmlXPathIsNaN(obj2->floatval) ||
109517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                    obj2->floatval < 1.0 || obj2->floatval > 65535.0 ||
109617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                    ((unsigned int) obj2->floatval) != obj2->floatval) {
109717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        fprintf(stderr, "invalid MIBenum at row %u\n", n);
109817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        xmlXPathFreeObject(obj2);
109917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        continue;
110017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
110117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
110217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                mibenum = obj2->floatval;
110317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                xmlXPathFreeObject(obj2);
110417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
110517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                /**
110617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ***     Search the associations for a corresponding CCSID.
110717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                **/
110817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
110917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                for (sp = chset_list; sp; sp = sp->c_next)
111017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        if (sp->c_mibenum == mibenum)
111117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                break;
111217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
111317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (!sp)
111417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        continue;       /* No CCSID for this MIBenum. */
111517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
111617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                /**
111717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ***     Process preferred MIME name.
111817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                **/
111917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
112017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                obj2 = xmlXPathEval(utf8_getprefname, ctxt);
112117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
112217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (!obj2 || obj2->type != XPATH_STRING) {
112317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        fprintf(stderr,
112417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                            "get Preferred_MIME_Name failed at row %u\n", n);
112517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        exit(1);
112617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
112717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
112817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (obj2->stringval && obj2->stringval[0])
112917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        nfaenter(obj2->stringval, -1, sp);
113017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
113117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                xmlXPathFreeObject(obj2);
113217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
113317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                /**
113417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ***     Process name.
113517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                **/
113617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
113717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                obj2 = xmlXPathEval(utf8_getname, ctxt);
113817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
113917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (!obj2 || obj2->type != XPATH_STRING) {
114017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        fprintf(stderr, "get name failed at row %u\n", n);
114117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        exit(1);
114217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
114317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
114417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (obj2->stringval && obj2->stringval[0])
114517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        nfaenter(obj2->stringval, -1, sp);
114617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
114717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                xmlXPathFreeObject(obj2);
114817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
114917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                /**
115017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ***     Process aliases.
115117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                **/
115217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
115317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                obj2 = xmlXPathEval(utf8_getaliases, ctxt);
115417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
115517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (!obj2 || obj2->type != XPATH_NODESET) {
115617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        fprintf(stderr, "get aliases failed at row %u\n", n);
115717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        exit(1);
115817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
115917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
116017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (obj2->nodesetval && obj2->nodesetval->nodeTab)
116117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        for (i = 0; i < obj2->nodesetval->nodeNr; i++) {
116217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                node = obj2->nodesetval->nodeTab[i];
116317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
116417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                if (node && node->content && node->content[0])
116517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        nfaenter(node->content, -1, sp);
116617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                }
116717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
116817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                xmlXPathFreeObject(obj2);
116917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
117017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
117117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlXPathFreeObject(obj1);
117217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlXPathFreeContext(ctxt);
117317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlFreeDoc(doc);
117417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
117517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
117617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
117717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratt_powerset *    closureset(t_powerset * dst, t_powerset * src);
117817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
117917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
118017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratt_powerset *
118117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratclosure(t_powerset * dst, t_state * src)
118217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
118317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
118417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_transition * t;
118517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int oldcard;
118617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
118717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (src->s_nfastates) {
118817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                /**
118917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ***     Is a DFA state: return closure of set of equivalent
119017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ***             NFA states.
119117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                **/
119217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
119317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                return closureset(dst, src->s_nfastates);
119417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
119517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
119617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
119717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Compute closure of NFA state.
119817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
119917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
120017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        dst = set_include(dst, src);
120117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
120217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (t = src->s_forward; t; t = t->t_forwnext)
120317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (t->t_token == EPSILON) {
120417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        oldcard = dst->p_card;
120517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        dst = set_include(dst, t->t_to);
120617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
120717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        if (oldcard != dst->p_card)
120817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                dst = closure(dst, t->t_to);
120917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
121017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
121117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return dst;
121217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
121317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
121417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
121517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratt_powerset *
121617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratclosureset(t_powerset * dst, t_powerset * src)
121717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
121817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
121917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int i;
122017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
122117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (i = 0; i < src->p_card; i++)
122217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                dst = closure(dst, (t_state *) src->p_set[i]);
122317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
122417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return dst;
122517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
122617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
122717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
122817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratt_state *
122917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratget_dfa_state(t_state * * stack,
123017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        t_powerset * nfastates, xmlHashTablePtr sethash)
123117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
123217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
123317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state * s;
123417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
123517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (s = hash_get(sethash, nfastates->p_set,
123617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat            nfastates->p_card * sizeof nfastates->p_set[0])) {
123717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                /**
123817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ***     DFA state already present.
123917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ***     Release the NFA state set and return
124017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ***             the address of the old DFA state.
124117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                **/
124217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
124317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                free((char *) nfastates);
124417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                return s;
124517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
124617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
124717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
124817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Build the new state.
124917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
125017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
125117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        s = newstate();
125217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        s->s_nfastates = nfastates;
125317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        s->s_next = dfa_states;
125417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        dfa_states = s;
125517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        s->s_stack = *stack;
125617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        *stack = s;
125717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
125817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
125917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Enter it in hash.
126017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
126117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
126217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (hash_add(sethash, nfastates->p_set,
126317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat            nfastates->p_card * sizeof nfastates->p_set[0], s))
126417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                chknull(NULL);          /* Memory allocation error. */
126517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
126617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return s;
126717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
126817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
126917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
127017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratint
127117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerattranscmp(const void * p1, const void * p2)
127217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
127317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
127417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_transition * t1;
127517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_transition * t2;
127617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
127717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t1 = *(t_transition * *) p1;
127817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t2 = *(t_transition * *) p2;
127917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return ((int) t1->t_token) - ((int) t2->t_token);
128017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
128117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
128217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
128317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratvoid
128417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratbuilddfa(void)
128517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
128617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
128717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_powerset * transset;
128817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_powerset * stateset;
128917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state * s;
129017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state * s2;
129117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int n;
129217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int i;
129317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int token;
129417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_transition * t;
129517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state * stack;
129617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlHashTablePtr sethash;
129717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int nst;
129817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
129917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        transset = set_include(NULL, NULL);
130017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        chknull(transset);
130117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        stateset = set_include(NULL, NULL);
130217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        chknull(stateset);
130317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        sethash = xmlHashCreate(1);
130417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        chknull(sethash);
130517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        dfa_states = (t_state *) NULL;
130617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        stack = (t_state *) NULL;
130717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        nst = 0;
130817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
130917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
131017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Build the DFA initial state.
131117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
131217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
131317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        get_dfa_state(&stack, closure(NULL, initial_state), sethash);
131417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
131517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
131617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Build the other DFA states by looking at each
131717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***             possible transition from stacked DFA states.
131817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
131917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
132017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        do {
132117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (!(++nst % 100))
132217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        fprintf(stderr, "%u DFA states\n", nst);
132317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
132417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                s = stack;
132517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                stack = s->s_stack;
132617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                s->s_stack = (t_state *) NULL;
132717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
132817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                /**
132917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ***     Build a set of all non-epsilon transitions from this
133017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ***             state.
133117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                **/
133217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
133317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                transset->p_card = 0;
133417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
133517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                for (n = 0; n < s->s_nfastates->p_card; n++) {
133617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        s2 = s->s_nfastates->p_set[n];
133717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
133817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        for (t = s2->s_forward; t; t = t->t_forwnext)
133917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                if (t->t_token != EPSILON) {
134017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        transset = set_include(transset, t);
134117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        chknull(transset);
134217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        }
134317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
134417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
134517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                /**
134617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ***     Sort transitions by token.
134717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                **/
134817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
134917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                qsort(transset->p_set, transset->p_card,
135017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                    sizeof transset->p_set[0], transcmp);
135117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
135217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                /**
135317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ***     Process all transitions, grouping them by token.
135417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                **/
135517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
135617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                stateset->p_card = 0;
135717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                token = EPSILON;
135817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
135917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                for (i = 0; i < transset->p_card; i++) {
136017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        t = transset->p_set[i];
136117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
136217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        if (token != t->t_token) {
136317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                if (stateset->p_card) {
136417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        /**
136517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        ***     Get the equivalent DFA state
136617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        ***             and create transition.
136717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        **/
136817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
136917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        newtransition(token, s,
137017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                            get_dfa_state(&stack,
137117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                            closureset(NULL, stateset),
137217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                            sethash));
137317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        stateset->p_card = 0;
137417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        }
137517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
137617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                token = t->t_token;
137717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                }
137817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
137917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        stateset = set_include(stateset, t->t_to);
138017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
138117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
138217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (stateset->p_card)
138317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        newtransition(token, s, get_dfa_state(&stack,
138417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                            closureset(NULL, stateset), sethash));
138517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        } while (stack);
138617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
138717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        free((char *) transset);
138817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        free((char *) stateset);
138917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlHashFree(sethash, NULL);
139017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
139117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
139217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Reverse the state list to get the initial state first,
139317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***             check for ambiguous prefixes, determine final states,
139417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***             destroy NFA state sets.
139517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
139617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
139717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        while (s = dfa_states) {
139817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                dfa_states = s->s_next;
139917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                s->s_next = stack;
140017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                stack = s;
140117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                stateset = s->s_nfastates;
140217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                s->s_nfastates = (t_powerset *) NULL;
140317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
140417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                for (n = 0; n < stateset->p_card; n++) {
140517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        s2 = (t_state *) stateset->p_set[n];
140617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
140717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        if (s2->s_final) {
140817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                if (s->s_final && s->s_final != s2->s_final)
140917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        fprintf(stderr,
141017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                            "Ambiguous name for CCSIDs %u/%u\n",
141117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                            s->s_final->c_ccsid,
141217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                            s2->s_final->c_ccsid);
141317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
141417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                s->s_final = s2->s_final;
141517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                }
141617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
141717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
141817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                free((char *) stateset);
141917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
142017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
142117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        dfa_states = stack;
142217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
142317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
142417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
142517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratvoid
142617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratdeletenfa(void)
142717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
142817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
142917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_transition * t;
143017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state * s;
143117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state * u;
143217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state * stack;
143317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
143417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        stack = initial_state;
143517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        stack->s_stack = (t_state *) NULL;
143617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
143717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        while ((s = stack)) {
143817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                stack = s->s_stack;
143917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
144017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                while ((t = s->s_forward)) {
144117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        u = t->t_to;
144217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        unlink_transition(t);
144317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        free((char *) t);
144417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
144517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        if (!u->s_backward) {
144617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                u->s_stack = stack;
144717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                stack = u;
144817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                }
144917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
145017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
145117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                free((char *) s);
145217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
145317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
145417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
145517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
145617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratt_stategroup *
145717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratnewgroup(void)
145817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
145917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
146017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_stategroup * g;
146117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
146217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        g = (t_stategroup *) malloc(sizeof *g);
146317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        chknull(g);
146417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        memset((char *) g, 0, sizeof *g);
146517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        g->g_id = groupid++;
146617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return g;
146717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
146817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
146917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
147017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratvoid
147117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratoptimizedfa(void)
147217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
147317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
147417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int i;
147517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlHashTablePtr h;
147617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state * s1;
147717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state * s2;
147817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state * finstates;
147917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state * * sp;
148017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_stategroup * g1;
148117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_stategroup * g2;
148217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_stategroup * ghead;
148317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_transition * t1;
148417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_transition * t2;
148517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int done;
148617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int startgroup;
148717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int gtrans[1 << (8 * sizeof(unsigned char))];
148817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
148917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
149017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Reduce DFA state count.
149117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
149217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
149317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        groupid = 0;
149417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ghead = (t_stategroup *) NULL;
149517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
149617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
149717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     First split: non-final and each distinct final states.
149817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
149917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
150017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        h = xmlHashCreate(4);
150117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        chknull(h);
150217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
150317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (s1 = dfa_states; s1; s1 = s1->s_next) {
150417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (!(g1 = hash_get(h, &s1->s_final, sizeof s1->s_final))) {
150517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        g1 = newgroup();
150617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        g1->g_next = ghead;
150717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        ghead = g1;
150817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
150917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        if (hash_add(h, &s1->s_final, sizeof s1->s_final, g1))
151017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                chknull(NULL);  /* Memory allocation error. */
151117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
151217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
151317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                s1->s_index = g1->g_id;
151417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                s1->s_stack = g1->g_member;
151517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                g1->g_member = s1;
151617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
151717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
151817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        xmlHashFree(h, NULL);
151917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
152017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
152117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Subsequent splits: states that have the same forward
152217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***             transition tokens to states in the same group.
152317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
152417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
152517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        do {
152617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                done = 1;
152717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
152817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                for (g2 = ghead; g2; g2 = g2->g_next) {
152917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        s1 = g2->g_member;
153017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
153117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        if (!s1->s_stack)
153217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                continue;
153317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
153417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        h = xmlHashCreate(1);
153517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        chknull(h);
153617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
153717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        /**
153817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        ***     Build the group transition map.
153917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        **/
154017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
154117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        memset((char *) gtrans, ~0, sizeof gtrans);
154217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
154317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        for (t1 = s1->s_forward; t1; t1 = t1->t_forwnext)
154417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                gtrans[t1->t_token] = t1->t_to->s_index;
154517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
154617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        if (hash_add(h, gtrans, sizeof gtrans, g2))
154717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                chknull(NULL);
154817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
154917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        /**
155017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        ***     Process other states in group.
155117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        **/
155217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
155317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        sp = &s1->s_stack;
155417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        s1 = *sp;
155517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
155617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        do {
155717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                *sp = s1->s_stack;
155817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
155917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                /**
156017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                ***     Build the transition map.
156117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                **/
156217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
156317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                memset((char *) gtrans, ~0, sizeof gtrans);
156417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
156517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                for (t1 = s1->s_forward;
156617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                    t1; t1 = t1->t_forwnext)
156717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        gtrans[t1->t_token] = t1->t_to->s_index;
156817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
156917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                g1 = hash_get(h, gtrans, sizeof gtrans);
157017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
157117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                if (g1 == g2) {
157217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        *sp = s1;
157317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        sp = &s1->s_stack;
157417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        }
157517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                else {
157617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        if (!g1) {
157717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                                g1 = newgroup();
157817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                                g1->g_next = ghead;
157917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                                ghead = g1;
158017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
158117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                                if (hash_add(h, gtrans,
158217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                                    sizeof gtrans, g1))
158317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                                        chknull(NULL);
158417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                                }
158517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
158617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        s1->s_index = g1->g_id;
158717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        s1->s_stack = g1->g_member;
158817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        g1->g_member = s1;
158917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        done = 0;
159017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                        }
159117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        } while (s1 = *sp);
159217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
159317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        xmlHashFree(h, NULL);
159417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
159517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        } while (!done);
159617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
159717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
159817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Establish group leaders and remap transitions.
159917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
160017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
160117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        startgroup = dfa_states->s_index;
160217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
160317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (g1 = ghead; g1; g1 = g1->g_next)
160417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                for (s1 = g1->g_member->s_stack; s1; s1 = s1->s_stack)
160517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        for (t1 = s1->s_backward; t1; t1 = t2) {
160617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                t2 = t1->t_backnext;
160717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                link_transition(t1, NULL, g1->g_member);
160817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                }
160917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
161017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
161117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Remove redundant states and transitions.
161217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
161317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
161417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (g1 = ghead; g1; g1 = g1->g_next) {
161517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                g1->g_member->s_next = (t_state *) NULL;
161617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
161717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                while ((s1 = g1->g_member->s_stack)) {
161817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        g1->g_member->s_stack = s1->s_stack;
161917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
162017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        for (t1 = s1->s_forward; t1; t1 = t2) {
162117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                t2 = t1->t_forwnext;
162217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                unlink_transition(t1);
162317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                free((char *) t1);
162417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                }
162517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
162617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        free((char *) s1);
162717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
162817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
162917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
163017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
163117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Remove group support and relink DFA states.
163217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
163317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
163417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        dfa_states = (t_state *) NULL;
163517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        s2 = (t_state *) NULL;
163617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        finstates = (t_state *) NULL;
163717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
163817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        while (g1 = ghead) {
163917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ghead = g1->g_next;
164017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                s1 = g1->g_member;
164117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
164217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (g1->g_id == startgroup)
164317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        dfa_states = s1;        /* Keep start state first. */
164417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                else if (s1->s_final) {         /* Then final states. */
164517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        s1->s_next = finstates;
164617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        finstates = s1;
164717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
164817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                else {                  /* Finish with non-final states. */
164917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        s1->s_next = s2;
165017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        s2 = s1;
165117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
165217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
165317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                free((char *) g1);
165417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
165517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
165617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (dfa_states->s_next = finstates; finstates->s_next;)
165717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                finstates = finstates->s_next;
165817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
165917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        finstates->s_next = s2;
166017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
166117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
166217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
166317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratconst char *
166417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratinttype(unsigned long max)
166517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
166617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
166717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        int i;
166817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
166917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (i = 0; max; i++)
167017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                max >>= 1;
167117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
167217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (i > 8 * sizeof(unsigned int))
167317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                return "unsigned long";
167417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
167517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (i > 8 * sizeof(unsigned short))
167617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                return "unsigned int";
167717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
167817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (i > 8 * sizeof(unsigned char))
167917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                return "unsigned short";
168017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
168117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        return "unsigned char";
168217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
168317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
168417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
168517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratlistids(FILE * fp)
168617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
168717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
168817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int pos;
168917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_chset * cp;
169017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_symlist * lp;
169117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        char * srcp;
169217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        char * dstp;
169317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        size_t srcc;
169417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        size_t dstc;
169517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        char buf[80];
169617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
169717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(fp, "/**\n***     CCSID   For arg   Recognized name.\n");
169817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        pos = 0;
169917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
170017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (cp = chset_list; cp; cp = cp->c_next) {
170117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (pos) {
170217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        fprintf(fp, "\n");
170317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        pos = 0;
170417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
170517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
170617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (!cp->c_names)
170717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        continue;
170817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
170917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                pos = fprintf(fp, "***     %5u      %c     ", cp->c_ccsid,
171017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                    iconv_open_error(cp->c_fromUTF8)? ' ': 'X');
171117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
171217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                for (lp = cp->c_names; lp; lp = lp->l_next) {
171317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        srcp = (char *) lp->l_symbol;
171417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        srcc = strlen(srcp);
171517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        dstp = buf;
171617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        dstc = sizeof buf;
171717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        iconv(utf82job, &srcp, &srcc, &dstp, &dstc);
171817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        srcc = dstp - buf;
171917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
172017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        if (pos + srcc > 79) {
172117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                fprintf(fp, "\n***%22c", ' ');
172217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                pos = 25;
172317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                }
172417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
172517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        pos += fprintf(fp, " %.*s", srcc, buf);
172617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
172717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
172817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
172917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (pos)
173017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                fprintf(fp, "\n");
173117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
173217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(fp, "**/\n\n");
173317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
173417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
173517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
173617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratvoid
173717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratgenerate(FILE * fp)
173817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
173917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
174017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int nstates;
174117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int ntrans;
174217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int maxfinal;
174317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_state * s;
174417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_transition * t;
174517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int i;
174617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        unsigned int pos;
174717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        char * ns;
174817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
174917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
175017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Assign indexes to states and transitions.
175117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
175217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
175317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        nstates = 0;
175417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ntrans = 0;
175517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        maxfinal = 0;
175617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
175717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (s = dfa_states; s; s = s->s_next) {
175817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                s->s_index = nstates++;
175917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
176017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (s->s_final)
176117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        maxfinal = nstates;
176217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
176317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                for (t = s->s_forward; t; t = t->t_forwnext)
176417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        t->t_index = ntrans++;
176517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
176617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
176717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(fp,
176817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat            "/**\n***     %u states, %u finals, %u transitions.\n**/\n\n",
176917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat            nstates, maxfinal, ntrans);
177017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(stderr, "%u states, %u finals, %u transitions.\n",
177117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat            nstates, maxfinal, ntrans);
177217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
177317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
177417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Generate types.
177517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
177617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
177717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(fp, "typedef unsigned short          t_ccsid;\n");
177817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(fp, "typedef %-23s t_staterange;\n", inttype(nstates));
177917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(fp, "typedef %-23s t_transrange;\n\n", inttype(ntrans));
178017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
178117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
178217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Generate first transition index for each state.
178317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
178417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
178517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(fp, "static t_transrange     trans_array[] = {\n");
178617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        pos = 0;
178717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ntrans = 0;
178817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
178917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (s = dfa_states; s; s = s->s_next) {
179017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                pos += fprintf(fp, " %u,", ntrans);
179117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
179217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (pos > 72) {
179317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        fprintf(fp, "\n");
179417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        pos = 0;
179517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
179617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
179717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                for (t = s->s_forward; t; t = t->t_forwnext)
179817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        ntrans++;
179917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
180017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
180117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(fp, " %u\n};\n\n", ntrans);
180217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
180317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
180417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Generate final state info.
180517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
180617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
180717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(fp, "static t_ccsid          final_array[] = {\n");
180817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        pos = 0;
180917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ns ="";
181017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        i = 0;
181117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
181217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (s = dfa_states; s && i++ < maxfinal; s = s->s_next) {
181317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                pos += fprintf(fp, "%s", ns);
181417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                ns = ",";
181517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
181617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                if (pos > 72) {
181717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        fprintf(fp, "\n");
181817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        pos = 0;
181917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
182017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
182117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                pos += fprintf(fp, " %u",
182217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                    s->s_final? s->s_final->c_ccsid + 1: 0);
182317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
182417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
182517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(fp, "\n};\n\n");
182617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
182717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
182817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Generate goto table.
182917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
183017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
183117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(fp, "static t_staterange     goto_array[] = {\n");
183217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        pos = 0;
183317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
183417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (s = dfa_states; s; s = s->s_next)
183517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                for (t = s->s_forward; t; t = t->t_forwnext) {
183617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        pos += fprintf(fp, " %u,", t->t_to->s_index);
183717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
183817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        if (pos > 72) {
183917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                fprintf(fp, "\n");
184017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                pos = 0;
184117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                }
184217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
184317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
184417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(fp, " %u\n};\n\n", nstates);
184517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
184617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
184717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Generate transition label table.
184817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
184917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
185017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(fp, "static unsigned char    label_array[] = {\n");
185117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        pos = 0;
185217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ns ="";
185317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
185417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        for (s = dfa_states; s; s = s->s_next)
185517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                for (t = s->s_forward; t; t = t->t_forwnext) {
185617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        pos += fprintf(fp, "%s", ns);
185717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        ns = ",";
185817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
185917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        if (pos > 72) {
186017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                fprintf(fp, "\n");
186117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                pos = 0;
186217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                                }
186317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
186417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        pos += fprintf(fp, " 0x%02X", t->t_token);
186517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                        }
186617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
186717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(fp, "\n};\n", nstates);
186817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
186917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
187017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
187117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratmain(argc, argv)
187217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratint argc;
187317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monneratchar * * argv;
187417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
187517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat{
187617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        FILE * fp;
187717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        t_chset * csp;
187817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        char symbuf[20];
187917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
188017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        chset_list = (t_chset *) NULL;
188117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        initial_state = newstate();
188217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        job2utf8 = iconv_open_ccsid(C_UTF8_CCSID, C_SOURCE_CCSID, 0);
188317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        utf82job = iconv_open_ccsid(C_SOURCE_CCSID, C_UTF8_CCSID, 0);
188417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
188517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (argc != 4) {
188617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                fprintf(stderr, "Usage: %s <ccsid-mibenum file> ", *argv);
188717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                fprintf(stderr, "<iana-character-set file> <output file>\n");
188817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                exit(1);
188917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
189017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
189117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
189217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Read CCSID/MIBenum associations. Define special names.
189317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
189417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
189517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        read_assocs(argv[1]);
189617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
189717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
189817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Read character set names and establish the case-independent
189917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***             name DFA in all possible CCSIDs.
190017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
190117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
190217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        read_iana(argv[2]);
190317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
190417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
190517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Build DFA from NFA.
190617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
190717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
190817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        builddfa();
190917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
191017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
191117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Delete NFA.
191217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
191317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
191417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        deletenfa();
191517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
191617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
191717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Minimize the DFA state count.
191817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
191917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
192017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        optimizedfa();
192117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
192217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        /**
192317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        ***     Generate the table.
192417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        **/
192517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
192617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fp = fopen(argv[3], "w+");
192717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
192817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (!fp) {
192917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                perror(argv[3]);
193017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                exit(1);
193117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
193217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
193317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(fp, "/**\n");
193417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(fp, "***     Character set names table.\n");
193517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(fp, "***     Generated by program BLDCSNDFA from");
193617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(fp, " IANA character set assignment file\n");
193717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(fp, "***          and CCSID/MIBenum equivalence file.\n");
193817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(fp, "***     *** Do not edit by hand ***\n");
193917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fprintf(fp, "**/\n\n");
194017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        listids(fp);
194117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        generate(fp);
194217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
194317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        if (ferror(fp)) {
194417951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                perror(argv[3]);
194517951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                fclose(fp);
194617951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                exit(1);
194717951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat                }
194817951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat
194917951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        fclose(fp);
195017951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        iconv_close(job2utf8);
195117951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        iconv_close(utf82job);
195217951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat        exit(0);
195317951ea28989d6ca70697cef7bfeeceebf4d94c5Patrick Monnerat}
1954