1 /*
2  * sbcs.c - routines to handle single-byte character sets.
3  */
4 
5 #include "charset.h"
6 #include "internal.h"
7 
8 /*
9  * The charset_spec for any single-byte character set should
10  * provide read_sbcs() as its read function, and its `data' field
11  * should be a wchar_t string constant containing the 256 entries
12  * of the translation table.
13  */
14 
read_sbcs(charset_spec const * charset,long int input_chr,charset_state * state,void (* emit)(void * ctx,long int output),void * emitctx)15 void read_sbcs(charset_spec const *charset, long int input_chr,
16                charset_state *state,
17                void (*emit)(void *ctx, long int output), void *emitctx)
18 {
19     const struct sbcs_data *sd = charset->data;
20 
21     UNUSEDARG(state);
22 
23     emit(emitctx, sd->sbcs2ucs[input_chr]);
24 }
25 
write_sbcs(charset_spec const * charset,long int input_chr,charset_state * state,void (* emit)(void * ctx,long int output),void * emitctx)26 void write_sbcs(charset_spec const *charset, long int input_chr,
27                 charset_state *state,
28                 void (*emit)(void *ctx, long int output), void *emitctx)
29 {
30     const struct sbcs_data *sd = charset->data;
31     int i, j, k, c;
32 
33     UNUSEDARG(state);
34 
35     /*
36      * Binary-search in the ucs2sbcs table.
37      */
38     i = -1;
39     j = sd->nvalid;
40     while (i+1 < j) {
41         k = (i+j)/2;
42         c = sd->ucs2sbcs[k];
43         if (input_chr < sd->sbcs2ucs[c])
44             j = k;
45         else if (input_chr > sd->sbcs2ucs[c])
46             i = k;
47         else {
48             emit(emitctx, c);
49             return;
50         }
51     }
52     emit(emitctx, ERROR);
53 }
54