fixed parsing for science direct html with more than one <a href=> per one <tr>
[webpac] / openisis / lcs.c
1 /*
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
5
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.
10
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.
15
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
19
20         see README for more information
21 EOH */
22
23 /*
24         $Id: lcs.c,v 1.8 2003/04/08 00:20:52 kripke Exp $
25         charset support
26 */
27
28 #include <string.h> /* memset */
29
30 #include "luti.h"
31 #include "lio.h"
32 #include "lcs.h"
33
34
35 /* ************************************************************
36         private types
37 */
38 /* ************************************************************
39         private data
40 */
41 /* ************************************************************
42         private functions
43 */
44 /* ************************************************************
45         package functions
46 */
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'
64 };
65
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,
77 /*  (     )     *     +     ,     -     .     /  */
78   LCS_P,LCS_P,LCS_P,LCS_P,LCS_T,LCS_P,LCS_P,LCS_P,
79 /*  0     1     2     3     4     5     6     7  */
80   LCS_D,LCS_D,LCS_D,LCS_D,LCS_D,LCS_D,LCS_D,LCS_D,
81 /*  8     9     :     ;     <     =     >     ?  */
82   LCS_D,LCS_D,LCS_T,LCS_T,LCS_P,LCS_T,LCS_P,LCS_P,
83 /*  @     A     B     C     D     E     F     G  */
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 */
87 /*  X     Y     Z     [     \     ]     ^     _  */
88   LCS_A,LCS_A,LCS_A,LCS_P,LCS_P,LCS_P,LCS_P,LCS_I,
89 /*  `     a     b     c     d     e     f     g  */
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,
95 /* 32 C0 controls */
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
114 };
115
116
117 /* ************************************************************
118         package functions
119 */
120 int lcs_mktab ( LcsTab *dst, char *n, int l, int bits )
121 {
122         int ret = 0;
123         unsigned char *c = dst->c;
124         unsigned short *u = dst->u;
125         int line = 1;
126         int i = 0;
127         memset( dst, 0, sizeof(*dst) );
128         for (;; i++ ) {
129                 unsigned short in = 0;
130                 for ( ; l && (*n < '0' || '9' < *n); n++, l-- ) /* skip nondigs */
131                         if ( '\n' == *n )
132                                 line++;
133                 if ( ! l )
134                         break;
135                 for ( ; l && '0' <= *n && *n <= '9'; n++, l--)
136                         in = 10*in + *n - '0';
137                 if ( bits < 0 ) {
138                         if ( i > 127 ) {
139                                 log_msg( LOG_WARN, "too many unicode values in input" );
140                                 return 0;
141                         }
142                         if ( in <= 0xffff )
143                                 u[i] = in;
144                         else
145                                 log_msg( ERR_INVAL, "unicode %d too big %dth value line %d",
146                                         in, i, line );
147                         continue;
148                 }
149                 if ( in > 0xff )
150                         log_msg( ERR_INVAL, "byte %d too big %dth value line %d",
151                                 in, i, line );
152                 else if ( bits )
153                         c[in] |= bits;
154                 else if ( i > 255 ) {
155                         log_msg( LOG_WARN, "too many values in input" );
156                         return 0;
157                 } else
158                         c[i] = (unsigned char)in;
159         }
160         return ret;
161 }       /* lcs_mktab */
162
163
164 int lcs_mkrecod ( unsigned char *dst, unsigned short *from,
165         unsigned short *to )
166 {
167         int i = 0, j;
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 ];
172                 dst[i] = ' ';
173                 if ( to )
174                         for ( j=128; j--; ) {
175                                 if ( s == to[j] ) {
176                                         dst[i] = (unsigned char)128+j;
177                                         break;
178                                 }
179                         }
180                 else if ( 256 > s ) /* map to latin 1 */
181                         dst[i] = (unsigned char)s;
182         }
183         return 0;
184 }       /* lcs_mkrecod */
185
186
187 /* ************************************************************
188         public functions
189 */