1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
/**
* this is a small sample script to use libmbfl.
* Rui Hirokawa <hirokawa@php.net>
*
* this file is encoded in EUC-JP.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mbfl/mbfilter.h"
static void hexdump(const mbfl_string *ptr)
{
unsigned int i;
for (i = 0; i < ptr->len; i++) {
printf("%%%02x", ptr->val[i]);
}
printf(" (%u)\n", ptr->len);
}
int main(int argc, char **argv)
{
enum mbfl_no_encoding no_enc;
const enum mbfl_no_language no_lang = mbfl_no_language_japanese;
mbfl_memory_device dev;
mbfl_string string, result;
int final = 0;
int state = 0;
int mode = 0;
if (argc < 3) {
fprintf(stderr, "Usage: %s encoding flags\n", argv[0]);
return EXIT_FAILURE;
}
if ((no_enc = mbfl_name2no_encoding(argv[1])) ==
mbfl_no_encoding_invalid) {
printf("Unsupported encoding: %s\n", argv[1]);
return EXIT_FAILURE;
}
{
const char *p;
for (p= argv[2] + strlen(argv[2]); p > argv[2]; ) {
switch (*(--p)) {
case 'A':
mode |= 0x1;
break;
case 'a':
mode |= 0x10;
break;
case 'R':
mode |= 0x2;
break;
case 'r':
mode |= 0x20;
break;
case 'N':
mode |= 0x4;
break;
case 'n':
mode |= 0x40;
break;
case 'S':
mode |= 0x8;
break;
case 's':
mode |= 0x80;
break;
case 'K':
mode |= 0x100;
break;
case 'k':
mode |= 0x1000;
break;
case 'H':
mode |= 0x200;
break;
case 'h':
mode |= 0x2000;
break;
case 'V':
mode |= 0x800;
break;
case 'C':
mode |= 0x10000;
break;
case 'c':
mode |= 0x20000;
break;
case 'M':
mode |= 0x100000;
break;
case 'm':
mode |= 0x200000;
break;
}
}
}
do {
mbfl_memory_device_init(&dev, 0, 4096);
mbfl_string_init_set(&string, no_lang, no_enc);
for (;;) {
const int c = fgetc(stdin);
if (c == EOF) {
final = 1;
break;
} else if (c == 10) {
if (state == 1) {
state = 0;
continue;
}
break;
} else if (c == 13) {
state = 1;
break;
}
if (dev.pos >= dev.length) {
if (dev.length + dev.allocsz < dev.length) {
printf("Unable to allocate memory\n");
return EXIT_FAILURE;
}
mbfl_memory_device_realloc(&dev, dev.length + dev.allocsz,
dev.allocsz);
}
dev.buffer[dev.pos++] = (unsigned char)c;
}
mbfl_memory_device_result(&dev, &string);
mbfl_ja_jp_hantozen(&string, &result, mode);
hexdump(&result);
mbfl_string_clear(&result);
mbfl_string_clear(&string);
} while (!final);
return EXIT_SUCCESS;
}
|