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