1 /*
2  * Copyright 1998, Gisle Aas.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the same terms as Perl itself.
6  */
7 
8 
9 #ifdef PERL
10 #include "EXTERN.h"
11 #include "perl.h"
12 #include "XSUB.h"
13 #else
14 typedef unsigned long   U32;
15 typedef unsigned short  U16;
16 typedef unsigned char   U8;
17 #endif
18 
19 #ifndef pTHX_
20    #define pTHX_
21 #endif
22 
23 #ifndef dTHX
24    #define dTHX extern int errno
25 #endif
26 
27 struct map8;
28 
29 typedef U8*  (*map8_cb8)  (U16, struct map8*, STRLEN*);
30 typedef U16* (*map8_cb16) (U8,  struct map8*, STRLEN*);
31 
32 typedef struct map8
33 {
34   U16     to_16[256];
35   U16*    to_8 [256]; /* two level table, first level is (char>>8) */
36 
37   /* default mapping values (to use if mapping is NOCHAR) */
38   U16     def_to8;
39   U16     def_to16;
40 
41   /* callback functions (to use if mapping and default is NOCHAR */
42   map8_cb8  cb_to8;
43   map8_cb16 cb_to16;
44 
45   void*   obj;  /* extra info of some kind */
46 } Map8;
47 
48 /* A binary mapping file is a sequence of one or more of these records.
49  * The numbers are stored in network byte order (big endian)
50  */
51 struct map8_filerec
52 {
53   U16  u8;
54   U16 u16;
55 };
56 
57 /* The first record of a binary file is a magic record with these
58  * values.  The second value also serves as a file format version
59  * number.
60  */
61 #define MAP8_BINFILE_MAGIC_HI 0xFFFE
62 #define MAP8_BINFILE_MAGIC_LO 0x0001
63 
64 #define NOCHAR  0xFFFF         /* U+FFFF is guaranteed not to be used */
65 #define map8_to_char16(m,c)    (m)->to_16[c]
66 #define map8_to_char8(m,c)     (m)->to_8[(c)>>8][(c)&0xFF]
67 
68 #define map8_set_def_to8(m,c)  (m)->def_to8 = c
69 #define map8_get_def_to8(m)    (m)->def_to8
70 #define map8_set_def_to16(m,c) (m)->def_to16 = htons(c)
71 #define map8_get_def_to16(m)   ntohs((m)->def_to16)
72 
73 /* Prototypes */
74 Map8* map8_new(void);
75 Map8* map8_new_txtfile(const char*);
76 Map8* map8_new_binfile(const char*);
77 void  map8_addpair(Map8*, U8, U16);
78 void  map8_nostrict(Map8*);
79 void  map8_free(Map8*);
80 
81 U16*  map8_to_str16(Map8*, U8*, U16*, int, int*);
82 U8*   map8_to_str8 (Map8*, U16*, U8*, int, int*);
83 U8*   map8_recode_8(Map8*, Map8*, U8*, U8*, int, int*);
84 
85 int   map8_empty_block(Map8*, U8);
86 
87 #ifdef MAP8_DEBUGGING
88 #include <stdio.h>
89 
90 void map8_print(Map8*);
91 void map8_fprint(Map8*,FILE*);
92 #endif
93