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