2 openisis - an open implementation of the CDS/ISIS database
3 Version 0.8.x (patchlevel see file Version)
4 Copyright (C) 2001-2003 by Erik Grziwotz, erik@openisis.org
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with this library; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 see README for more information
24 $Id: lcs.c,v 1.8 2003/04/08 00:20:52 kripke Exp $
28 #include <string.h> /* memset */
35 /* ************************************************************
38 /* ************************************************************
41 /* ************************************************************
44 /* ************************************************************
47 unsigned char lcs_latin1_uc[256] = {
48 0,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
49 ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
50 ' ','!','"','#','$','%','&','\'','(',')','*','+',',','-','.','/',
51 '0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?',
52 '@','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',
53 'P','Q','R','S','T','U','V','W','X','Y','Z','[','\\',']','^','_',
54 '`','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',
55 'P','Q','R','S','T','U','V','W','X','Y','Z','{','|','}','~',' ',
56 ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
57 ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
58 ' ',161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
59 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
60 'A','A','A','A','A','A','A','C','E','E','E','E','I','I','I','I',
61 'T','N','O','O','O','O','O',215,'O','U','U','U','U','Y','T','S',
62 'A','A','A','A','A','A','A','C','E','E','E','E','I','I','I','I',
63 'T','N','O','O','O','O','O',247,'O','U','U','U','U','Y','T','Y'
66 unsigned char lcs_latin1_ct[256] = {
67 /* NUL STX SOT ETX EOT ENQ ACK BEL */
68 LCS_F,LCS_C,LCS_C,LCS_C,LCS_C,LCS_C,LCS_C,LCS_C,
69 /* BS HT LF VT FF CR SO SI */
70 LCS_C,LCS_C,LCS_F,LCS_C,LCS_R,LCS_F,LCS_C,LCS_C,
71 /* DLE DC1 DC2 DC3 DC4 NAK SYN ETB */
72 LCS_C,LCS_C,LCS_C,LCS_C,LCS_C,LCS_C,LCS_C,LCS_C,
73 /* CAN EM SUB ESC FS GS RS US */
74 LCS_C,LCS_C,LCS_C,LCS_C,LCS_C,LCS_R,LCS_F,LCS_C,
75 /*blank ! " # $ % & ' */
76 LCS_S,LCS_P,LCS_P,LCS_P,LCS_P,LCS_P,LCS_P,LCS_P,
78 LCS_P,LCS_P,LCS_P,LCS_P,LCS_T,LCS_P,LCS_P,LCS_P,
80 LCS_D,LCS_D,LCS_D,LCS_D,LCS_D,LCS_D,LCS_D,LCS_D,
82 LCS_D,LCS_D,LCS_T,LCS_T,LCS_P,LCS_T,LCS_P,LCS_P,
84 LCS_P,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,
85 LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A, /* H-O */
86 LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A, /* P-W */
88 LCS_A,LCS_A,LCS_A,LCS_P,LCS_P,LCS_P,LCS_P,LCS_I,
90 LCS_P,LCS_L,LCS_A,LCS_L,LCS_A,LCS_A,LCS_A,LCS_A,
91 LCS_A,LCS_L,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,
92 LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,
93 /* x y z { | } ~ DEL */
94 LCS_L,LCS_A,LCS_A,LCS_P,LCS_P,LCS_P,LCS_P,LCS_C,
96 LCS_P,LCS_P,LCS_P,LCS_P,LCS_P,LCS_P,LCS_P,LCS_P,
97 LCS_P,LCS_P,LCS_P,LCS_P,LCS_P,LCS_P,LCS_P,LCS_P,
98 LCS_P,LCS_P,LCS_P,LCS_P,LCS_P,LCS_P,LCS_P,LCS_P,
99 LCS_P,LCS_P,LCS_P,LCS_P,LCS_P,LCS_P,LCS_P,LCS_P,
100 /* 32 mostly symbols */
101 LCS_S,LCS_Y,LCS_Y,LCS_Y,LCS_Y,LCS_Y,LCS_Y,LCS_Y,
102 LCS_Y,LCS_Y,LCS_Y,LCS_Y,LCS_Y,LCS_Y,LCS_Y,LCS_Y,
103 LCS_Y,LCS_Y,LCS_Y,LCS_Y,LCS_Y,LCS_Y,LCS_Y,LCS_Y,
104 LCS_Y,LCS_Y,LCS_Y,LCS_Y,LCS_Y,LCS_Y,LCS_Y,LCS_Y,
105 /* 64 Latin alphas including 2 symbols */
106 LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,
107 LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,
108 LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_Y,
109 LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,
110 LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,
111 LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,
112 LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_Y,
113 LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A,LCS_A
117 /* ************************************************************
120 int lcs_mktab ( LcsTab *dst, char *n, int l, int bits )
123 unsigned char *c = dst->c;
124 unsigned short *u = dst->u;
127 memset( dst, 0, sizeof(*dst) );
129 unsigned short in = 0;
130 for ( ; l && (*n < '0' || '9' < *n); n++, l-- ) /* skip nondigs */
135 for ( ; l && '0' <= *n && *n <= '9'; n++, l--)
136 in = 10*in + *n - '0';
139 log_msg( LOG_WARN, "too many unicode values in input" );
145 log_msg( ERR_INVAL, "unicode %d too big %dth value line %d",
150 log_msg( ERR_INVAL, "byte %d too big %dth value line %d",
154 else if ( i > 255 ) {
155 log_msg( LOG_WARN, "too many values in input" );
158 c[i] = (unsigned char)in;
164 int lcs_mkrecod ( unsigned char *dst, unsigned short *from,
168 for ( i=0; i<128; i++ )
169 dst[i] = (unsigned char)i; /* identity */
170 for ( ; i<256; i++ ) {
171 unsigned short s = from[ i - 128 ];
174 for ( j=128; j--; ) {
176 dst[i] = (unsigned char)128+j;
180 else if ( 256 > s ) /* map to latin 1 */
181 dst[i] = (unsigned char)s;
187 /* ************************************************************