OSDN Git Service

006e84396c6a39675396d0afc69cbf4ed5cfc355
[ffftp/ffftp.git] / codecnv.c
1 /*=============================================================================\r
2 *\r
3 *                                                       \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\81^\89ü\8ds\83R\81[\83h\95Ï\8a·\r
4 *\r
5 ===============================================================================\r
6 / Copyright (C) 1997-2007 Sota. All rights reserved.\r
7 /\r
8 / Redistribution and use in source and binary forms, with or without \r
9 / modification, are permitted provided that the following conditions \r
10 / are met:\r
11 /\r
12 /  1. Redistributions of source code must retain the above copyright \r
13 /     notice, this list of conditions and the following disclaimer.\r
14 /  2. Redistributions in binary form must reproduce the above copyright \r
15 /     notice, this list of conditions and the following disclaimer in the \r
16 /     documentation and/or other materials provided with the distribution.\r
17 /\r
18 / THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR \r
19 / IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES \r
20 / OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r
21 / IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, \r
22 / INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r
23 / BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF \r
24 / USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON \r
25 / ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
26 / (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF \r
27 / THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
28 /============================================================================*/\r
29 \r
30 #define STRICT\r
31 #include <stdio.h>\r
32 #include <stdlib.h>\r
33 #include <string.h>\r
34 #include <winsock.h>\r
35 #include <mbstring.h>\r
36 #include <windowsx.h>\r
37 \r
38 #include "common.h"\r
39 #include "resource.h"\r
40 \r
41 \r
42 \r
43 #define CONV_ASCII              0               /* ASCII\95\8e\9a\8f\88\97\9d\92\86 */\r
44 #define CONV_KANJI              1               /* \8a¿\8e\9a\8f\88\97\9d\92\86 */\r
45 #define CONV_KANA               2               /* \94¼\8ap\83J\83^\83J\83i\8f\88\97\9d\92\86 */\r
46 \r
47 \r
48 /*===== \83v\83\8d\83g\83^\83C\83v =====*/\r
49 \r
50 static char *ConvEUCtoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put);\r
51 static char *ConvJIStoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put);\r
52 static char *ConvSJIStoEUCkanaProc(CODECONVINFO *cInfo, char Dt, char *Put);\r
53 static char *ConvSJIStoJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put);\r
54 static int HanKataToZen(char Ch);\r
55 static int AskDakuon(char Ch, char Daku);\r
56 \r
57 static int CheckOnSJIS(uchar *Pos, uchar *Btm);\r
58 static int CheckOnEUC(uchar *Pos, uchar *Btm);\r
59 static int ConvertIBMExtendedChar(int code);\r
60 \r
61 \r
62 \r
63 #if 0\r
64 /*----- \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\82Ì\83e\83X\83g\83v\83\8d\83O\83\89\83\80 ------------------------------------*/\r
65 \r
66 void CodeCnvTest(void)\r
67 {\r
68         #define BUFBUF  43\r
69         #define BUFBUF2 BUFBUF+3\r
70 \r
71         CODECONVINFO cInfo;\r
72         char Buf[BUFBUF];\r
73         char Buf2[BUFBUF2];\r
74         FILE *Strm1;\r
75         FILE *Strm2;\r
76         int Byte;\r
77         int Continue;\r
78 \r
79 //      DoPrintf("---START ZEN");\r
80 \r
81         Strm1 = fopen("in.txt", "rb");\r
82         Strm2 = fopen("out_zen.txt", "wb");\r
83 \r
84         InitCodeConvInfo(&cInfo);\r
85         cInfo.KanaCnv = YES;\r
86 \r
87 \r
88         while((Byte = fread(Buf, 1, BUFBUF, Strm1)) != 0)\r
89         {\r
90                 cInfo.Str = Buf;\r
91                 cInfo.StrLen = Byte;\r
92                 cInfo.Buf = Buf2;\r
93                 cInfo.BufSize = BUFBUF2;\r
94 \r
95 //              DoPrintf("READ %d", Byte);\r
96 \r
97                 do\r
98                 {\r
99 //                      Continue = ConvEUCtoSJIS(&cInfo);\r
100 //                      Continue = ConvJIStoSJIS(&cInfo);\r
101 //                      Continue = ConvSJIStoEUC(&cInfo);\r
102 //                      Continue = ConvSJIStoJIS(&cInfo);\r
103                         Continue = ConvSMBtoSJIS(&cInfo);\r
104 //                      Continue = ConvSJIStoSMB_HEX(&cInfo);\r
105 //                      Continue = ConvSJIStoSMB_CAP(&cInfo);\r
106 \r
107                         fwrite(Buf2, cInfo.OutLen, 1, Strm2);\r
108 //                      DoPrintf("WRITE %d", cInfo.OutLen);\r
109 \r
110                 }\r
111                 while(Continue == YES);\r
112         }\r
113 \r
114         cInfo.Buf = Buf2;\r
115         cInfo.BufSize = BUFBUF2;\r
116         FlushRestData(&cInfo);\r
117         fwrite(Buf2, cInfo.OutLen, 1, Strm2);\r
118 //      DoPrintf("WRITE %d", cInfo.OutLen);\r
119 \r
120 \r
121         fclose(Strm1);\r
122         fclose(Strm2);\r
123 \r
124 \r
125 //      DoPrintf("---START HAN");\r
126 \r
127         Strm1 = fopen("in.txt", "rb");\r
128         Strm2 = fopen("out_han.txt", "wb");\r
129 \r
130         InitCodeConvInfo(&cInfo);\r
131         cInfo.KanaCnv = NO;\r
132 \r
133 \r
134         while((Byte = fread(Buf, 1, BUFBUF, Strm1)) != 0)\r
135         {\r
136                 cInfo.Str = Buf;\r
137                 cInfo.StrLen = Byte;\r
138                 cInfo.Buf = Buf2;\r
139                 cInfo.BufSize = BUFBUF2;\r
140 \r
141 //              DoPrintf("READ %d", Byte);\r
142 \r
143                 do\r
144                 {\r
145 //                      Continue = ConvEUCtoSJIS(&cInfo);\r
146 //                      Continue = ConvJIStoSJIS(&cInfo);\r
147 //                      Continue = ConvSJIStoEUC(&cInfo);\r
148 //                      Continue = ConvSJIStoJIS(&cInfo);\r
149                         Continue = ConvSMBtoSJIS(&cInfo);\r
150 //                      Continue = ConvSJIStoSMB_HEX(&cInfo);\r
151 //                      Continue = ConvSJIStoSMB_CAP(&cInfo);\r
152                         fwrite(Buf2, cInfo.OutLen, 1, Strm2);\r
153 //                      DoPrintf("WRITE %d", cInfo.OutLen);\r
154 \r
155                 }\r
156                 while(Continue == YES);\r
157         }\r
158 \r
159         cInfo.Buf = Buf2;\r
160         cInfo.BufSize = BUFBUF2;\r
161         FlushRestData(&cInfo);\r
162         fwrite(Buf2, cInfo.OutLen, 1, Strm2);\r
163 //      DoPrintf("WRITE %d", cInfo.OutLen);\r
164 \r
165         fclose(Strm1);\r
166         fclose(Strm2);\r
167 \r
168 //      DoPrintf("---END");\r
169 \r
170         return;\r
171 }\r
172 #endif\r
173 \r
174 \r
175 \r
176 #if 0\r
177 /*----- \89ü\8ds\83R\81[\83h\95Ï\8a·\82Ì\83e\83X\83g\83v\83\8d\83O\83\89\83\80 ------------------------------------*/\r
178 \r
179 void TermCodeCnvTest(void)\r
180 {\r
181         #define BUFBUF  10\r
182         #define BUFBUF2 BUFBUF\r
183 \r
184         TERMCODECONVINFO cInfo;\r
185         char Buf[BUFBUF];\r
186         char Buf2[BUFBUF2];\r
187         FILE *Strm1;\r
188         FILE *Strm2;\r
189         int Byte;\r
190         int Continue;\r
191 \r
192 //      DoPrintf("---START");\r
193 \r
194         Strm1 = fopen("in.txt", "rb");\r
195         Strm2 = fopen("out.txt", "wb");\r
196 \r
197         InitTermCodeConvInfo(&cInfo);\r
198 \r
199         while((Byte = fread(Buf, 1, BUFBUF, Strm1)) != 0)\r
200         {\r
201                 cInfo.Str = Buf;\r
202                 cInfo.StrLen = Byte;\r
203                 cInfo.Buf = Buf2;\r
204                 cInfo.BufSize = BUFBUF2;\r
205 \r
206 //              DoPrintf("READ %d", Byte);\r
207 \r
208                 do\r
209                 {\r
210                         Continue = ConvTermCodeToCRLF(&cInfo);\r
211 \r
212                         fwrite(Buf2, cInfo.OutLen, 1, Strm2);\r
213 //                      DoPrintf("WRITE %d", cInfo.OutLen);\r
214 \r
215                 }\r
216                 while(Continue == YES);\r
217         }\r
218 \r
219         cInfo.Buf = Buf2;\r
220         cInfo.BufSize = BUFBUF2;\r
221         FlushRestTermCodeConvData(&cInfo);\r
222         fwrite(Buf2, cInfo.OutLen, 1, Strm2);\r
223 //      DoPrintf("WRITE %d", cInfo.OutLen);\r
224 \r
225         fclose(Strm1);\r
226         fclose(Strm2);\r
227 \r
228 //      DoPrintf("---END");\r
229 \r
230         return;\r
231 }\r
232 #endif\r
233 \r
234 \r
235 \r
236 \r
237 \r
238 \r
239 \r
240 \r
241 \r
242 \r
243 \r
244 \r
245 /*----- \89ü\8ds\83R\81[\83h\95Ï\8a·\8fî\95ñ\82ð\8f\89\8aú\89» --------------------------------------------\r
246 *\r
247 *       Parameter\r
248 *               TERMCODECONVINFO *cInfo : \89ü\8ds\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
249 *\r
250 *       Return Value\r
251 *               \82È\82µ\r
252 *----------------------------------------------------------------------------*/\r
253 \r
254 void InitTermCodeConvInfo(TERMCODECONVINFO *cInfo)\r
255 {\r
256         cInfo->Term = 0;\r
257         return;\r
258 }\r
259 \r
260 \r
261 /*----- \89ü\8ds\83R\81[\83h\95Ï\8a·\82Ì\8ec\82è\8fî\95ñ\82ð\8fo\97Í ----------------------------------------\r
262 *\r
263 *       Parameter\r
264 *               TERMCODECONVINFO *cInfo : \89ü\8ds\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
265 *\r
266 *       Return Value\r
267 *               int \82­\82è\95Ô\82µ\83t\83\89\83O (=NO)\r
268 *\r
269 *       Note\r
270 *               \89ü\8ds\83R\81[\83h\95Ï\8a·\82Ì\8dÅ\8cã\82É\8cÄ\82Ô\8e\96\r
271 *----------------------------------------------------------------------------*/\r
272 \r
273 int FlushRestTermCodeConvData(TERMCODECONVINFO *cInfo)\r
274 {\r
275         char *Put;\r
276 \r
277         Put = cInfo->Buf;\r
278 \r
279         if(cInfo->Term == 0x0D)\r
280                 *Put++ = 0x0A;\r
281 \r
282         cInfo->OutLen = Put - cInfo->Buf;\r
283 \r
284         return(NO);\r
285 }\r
286 \r
287 \r
288 /*----- \89ü\8ds\83R\81[\83h\82ðCRLF\82É\95Ï\8a· -------------------------------------------------\r
289 *\r
290 *       Parameter\r
291 *               TERMCODECONVINFO *cInfo : \89ü\8ds\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
292 *\r
293 *       Return Value\r
294 *               int \82­\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
295 *\r
296 *       Note\r
297 *               \82­\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
298 *----------------------------------------------------------------------------*/\r
299 \r
300 int ConvTermCodeToCRLF(TERMCODECONVINFO *cInfo)\r
301 {\r
302         char *Str;\r
303         char *Put;\r
304         char *Limit;\r
305         int Continue;\r
306 \r
307         Continue = NO;\r
308         Str = cInfo->Str;\r
309         Put = cInfo->Buf;\r
310         Limit = cInfo->Buf + cInfo->BufSize - 1;\r
311 \r
312         for(; cInfo->StrLen > 0; cInfo->StrLen--)\r
313         {\r
314                 if(Put >= Limit)\r
315                 {\r
316                         Continue = YES;\r
317                         break;\r
318                 }\r
319 \r
320                 if(*Str == 0x0D)\r
321                 {\r
322                         if(cInfo->Term == 0x0D)\r
323                                 *Put++ = 0x0A;\r
324                         *Put++ = 0x0D;\r
325                         cInfo->Term = *Str++;\r
326                 }\r
327                 else\r
328                 {\r
329                         if(*Str == 0x0A)\r
330                         {\r
331                                 if(cInfo->Term != 0x0D)\r
332                                         *Put++ = 0x0D;\r
333                         }\r
334                         else\r
335                         {\r
336                                 if(cInfo->Term == 0x0D)\r
337                                         *Put++ = 0x0A;\r
338                         }\r
339                         cInfo->Term = 0;\r
340                         *Put++ = *Str++;\r
341                 }\r
342         }\r
343 \r
344         cInfo->Str = Str;\r
345         cInfo->OutLen = Put - cInfo->Buf;\r
346 \r
347         return(Continue);\r
348 }\r
349 \r
350 \r
351 /*----- \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\82ð\8f\89\8aú\89» --------------------------------------------\r
352 *\r
353 *       Parameter\r
354 *               CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
355 *\r
356 *       Return Value\r
357 *               \82È\82µ\r
358 *----------------------------------------------------------------------------*/\r
359 \r
360 void InitCodeConvInfo(CODECONVINFO *cInfo)\r
361 {\r
362         cInfo->KanaCnv = YES;\r
363 \r
364         cInfo->EscProc = 0;\r
365         cInfo->KanjiMode = CONV_ASCII;\r
366         cInfo->KanjiFst = 0;\r
367         cInfo->KanaPrev = 0;\r
368         cInfo->KanaProc = NULL;\r
369         return;\r
370 }\r
371 \r
372 \r
373 /*----- \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\82Ì\8ec\82è\8fî\95ñ\82ð\8fo\97Í ----------------------------------------\r
374 *\r
375 *       Parameter\r
376 *               CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
377 *\r
378 *       Return Value\r
379 *               int \82­\82è\95Ô\82µ\83t\83\89\83O (=NO)\r
380 *\r
381 *       Note\r
382 *               \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\82Ì\8dÅ\8cã\82É\8cÄ\82Ô\8e\96\r
383 *----------------------------------------------------------------------------*/\r
384 \r
385 int FlushRestData(CODECONVINFO *cInfo)\r
386 {\r
387         char *Put;\r
388 \r
389         Put = cInfo->Buf;\r
390 \r
391         if(cInfo->KanaProc != NULL)\r
392                 Put = (cInfo->KanaProc)(cInfo, 0, Put);\r
393 \r
394         if(cInfo->KanjiFst != 0)\r
395                 *Put++ = cInfo->KanjiFst;\r
396         if(cInfo->EscProc >= 1)\r
397                 *Put++ = cInfo->EscCode[0];\r
398         if(cInfo->EscProc == 2)\r
399                 *Put++ = cInfo->EscCode[1];\r
400 \r
401         cInfo->OutLen = Put - cInfo->Buf;\r
402 \r
403         return(NO);\r
404 }\r
405 \r
406 \r
407 /*----- EUC\8a¿\8e\9a\83R\81[\83h\82ðSHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------------\r
408 *\r
409 *       Parameter\r
410 *               CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
411 *\r
412 *       Return Value\r
413 *               int \82­\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
414 *\r
415 *       Note\r
416 *               \82­\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
417 *----------------------------------------------------------------------------*/\r
418 \r
419 int ConvEUCtoSJIS(CODECONVINFO *cInfo)\r
420 {\r
421         int Kcode;\r
422         char *Str;\r
423         char *Put;\r
424         char *Limit;\r
425         int Continue;\r
426 \r
427         cInfo->KanaProc = &ConvEUCtoSJISkanaProc;\r
428 \r
429         Continue = NO;\r
430         Str = cInfo->Str;\r
431         Put = cInfo->Buf;\r
432         Limit = cInfo->Buf + cInfo->BufSize - 2;\r
433 \r
434         for(; cInfo->StrLen > 0; cInfo->StrLen--)\r
435         {\r
436                 if(Put >= Limit)\r
437                 {\r
438                         Continue = YES;\r
439                         break;\r
440                 }\r
441 \r
442                 if((*Str & 0x80) != 0)\r
443                 {\r
444                         if(cInfo->KanjiFst == 0)\r
445                                 cInfo->KanjiFst = *Str++;\r
446                         else\r
447                         {\r
448                                 if((uchar)cInfo->KanjiFst == (uchar)0x8E)       /* \94¼\8ap\83J\83^\83J\83i */\r
449                                 {\r
450                                         Put = ConvEUCtoSJISkanaProc(cInfo, *Str++, Put);\r
451                                 }\r
452                                 else\r
453                                 {\r
454                                         Put = ConvEUCtoSJISkanaProc(cInfo, 0, Put);\r
455 \r
456                                         Kcode = _mbcjistojms(((cInfo->KanjiFst & 0x7F) * 0x100) + (*Str++ & 0x7F));\r
457                                         *Put++ = HIGH8(Kcode);\r
458                                         *Put++ = LOW8(Kcode);\r
459                                 }\r
460                                 cInfo->KanjiFst = 0;\r
461                         }\r
462                 }\r
463                 else\r
464                 {\r
465                         Put = ConvEUCtoSJISkanaProc(cInfo, 0, Put);\r
466 \r
467                         if(cInfo->KanjiFst != 0)\r
468                         {\r
469                                 *Put++ = cInfo->KanjiFst;\r
470                                 cInfo->KanjiFst = 0;\r
471                         }\r
472                         *Put++ = *Str++;\r
473                 }\r
474         }\r
475 \r
476         cInfo->Str = Str;\r
477         cInfo->OutLen = Put - cInfo->Buf;\r
478 \r
479         return(Continue);\r
480 }\r
481 \r
482 \r
483 /*----- EUC-->SHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a·\82Ì\94¼\8ap\83J\83^\83J\83i\82Ì\8f\88\97\9d -------------------\r
484 *\r
485 *       Parameter\r
486 *               CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
487 *               char Dt : \95\8e\9a\r
488 *               char *Put : \83f\81[\83^\83Z\83b\83g\88Ê\92u\r
489 *\r
490 *       Return Value\r
491 *               char *\8e\9f\82Ì\83f\81[\83^\83Z\83b\83g\88Ê\92u\r
492 *----------------------------------------------------------------------------*/\r
493 \r
494 static char *ConvEUCtoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)\r
495 {\r
496         int Kcode;\r
497         int Daku;\r
498 \r
499         if(cInfo->KanaCnv == NO)\r
500         {\r
501                 if(Dt != 0)\r
502                         *Put++ = Dt;\r
503         }\r
504         else\r
505         {\r
506                 if(cInfo->KanaPrev != 0)\r
507                 {\r
508                         Daku = AskDakuon(cInfo->KanaPrev, Dt);\r
509 \r
510                         Kcode = _mbcjistojms(HanKataToZen(cInfo->KanaPrev)) + Daku;\r
511                         *Put++ = HIGH8(Kcode);\r
512                         *Put++ = LOW8(Kcode);\r
513 \r
514                         if(Daku == 0)\r
515                                 cInfo->KanaPrev = Dt;\r
516                         else\r
517                                 cInfo->KanaPrev = 0;\r
518                 }\r
519                 else\r
520                         cInfo->KanaPrev = Dt;\r
521         }\r
522         return(Put);\r
523 }\r
524 \r
525 \r
526 /*----- JIS\8a¿\8e\9a\83R\81[\83h\82ðSHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------------\r
527 *\r
528 *       Parameter\r
529 *               CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
530 *\r
531 *       Return Value\r
532 *               int \82­\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
533 *\r
534 *       Note\r
535 *               \82­\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
536 *\r
537 *               \83G\83X\83P\81[\83v\83R\81[\83h\82Í\81A\8e\9f\82Ì\82à\82Ì\82É\91Î\89\9e\82µ\82Ä\82¢\82é\r
538 *                       \8a¿\8e\9a\8aJ\8en                <ESC>$B         <ESC>$@\r
539 *                       \94¼\8ap\83J\83i\8aJ\8en    <ESC>(I\r
540 *                       \8a¿\8e\9a\8fI\97¹                <ESC>(B         <ESC>(J         <ESC>(H\r
541 *----------------------------------------------------------------------------*/\r
542 \r
543 int ConvJIStoSJIS(CODECONVINFO *cInfo)\r
544 {\r
545         int Kcode;\r
546         char *Str;\r
547         char *Put;\r
548         char *Limit;\r
549         int Continue;\r
550 \r
551         cInfo->KanaProc = &ConvJIStoSJISkanaProc;\r
552 \r
553         Continue = NO;\r
554         Str = cInfo->Str;\r
555         Put = cInfo->Buf;\r
556         Limit = cInfo->Buf + cInfo->BufSize - 3;\r
557 \r
558         for(; cInfo->StrLen > 0; cInfo->StrLen--)\r
559         {\r
560                 if(Put >= Limit)\r
561                 {\r
562                         Continue = YES;\r
563                         break;\r
564                 }\r
565 \r
566                 if(cInfo->EscProc == 0)\r
567                 {\r
568                         if(*Str == 0x1B)\r
569                         {\r
570                                 if(cInfo->KanjiFst != 0)\r
571                                 {\r
572                                         *Put++ = cInfo->KanjiFst;\r
573                                         cInfo->KanjiFst = 0;\r
574                                 }\r
575                                 Put = ConvJIStoSJISkanaProc(cInfo, 0, Put);\r
576 \r
577                                 cInfo->EscCode[cInfo->EscProc] = *Str++;\r
578                                 cInfo->EscProc++;\r
579                         }\r
580                         else\r
581                         {\r
582                                 if(cInfo->KanjiMode == CONV_KANA)\r
583                                 {\r
584                                         if(cInfo->KanjiFst != 0)\r
585                                         {\r
586                                                 *Put++ = cInfo->KanjiFst;\r
587                                                 cInfo->KanjiFst = 0;\r
588                                         }\r
589 \r
590                                         if((*Str >= 0x21) && (*Str <= 0x5F))\r
591                                         {\r
592                                                 Put = ConvJIStoSJISkanaProc(cInfo, *Str++, Put);\r
593                                         }\r
594                                         else\r
595                                         {\r
596                                                 Put = ConvJIStoSJISkanaProc(cInfo, 0, Put);\r
597                                                 *Put++ = *Str++;\r
598                                         }\r
599                                 }\r
600                                 else if(cInfo->KanjiMode == CONV_KANJI)\r
601                                 {\r
602                                         Put = ConvJIStoSJISkanaProc(cInfo, 0, Put);\r
603                                         if((*Str >= 0x21) && (*Str <= 0x7E))\r
604                                         {\r
605                                                 if(cInfo->KanjiFst == 0)\r
606                                                         cInfo->KanjiFst = *Str++;\r
607                                                 else\r
608                                                 {\r
609                                                         Kcode = _mbcjistojms((cInfo->KanjiFst * 0x100) + *Str++);\r
610                                                         *Put++ = HIGH8(Kcode);\r
611                                                         *Put++ = LOW8(Kcode);\r
612                                                         cInfo->KanjiFst = 0;\r
613                                                 }\r
614                                         }\r
615                                         else\r
616                                         {\r
617                                                 if(cInfo->KanjiFst == 0)\r
618                                                         *Put++ = *Str++;\r
619                                                 else\r
620                                                 {\r
621                                                         *Put++ = cInfo->KanjiFst;\r
622                                                         *Put++ = *Str++;\r
623                                                         cInfo->KanjiFst = 0;\r
624                                                 }\r
625                                         }\r
626                                 }\r
627                                 else\r
628                                 {\r
629                                         Put = ConvJIStoSJISkanaProc(cInfo, 0, Put);\r
630                                         *Put++ = *Str++;\r
631                                 }\r
632                         }\r
633                 }\r
634                 else if(cInfo->EscProc == 1)\r
635                 {\r
636                         if((*Str == '$') || (*Str == '('))\r
637                         {\r
638                                 cInfo->EscCode[cInfo->EscProc] = *Str++;\r
639                                 cInfo->EscProc++;\r
640                         }\r
641                         else\r
642                         {\r
643                                 *Put++ = cInfo->EscCode[0];\r
644                                 *Put++ = *Str++;\r
645                                 cInfo->EscProc = 0;\r
646                         }\r
647                 }\r
648                 else if(cInfo->EscProc == 2)\r
649                 {\r
650                         if((cInfo->EscCode[1] == '$') && ((*Str == 'B') || (*Str == '@')))\r
651                                 cInfo->KanjiMode = CONV_KANJI;\r
652                         else if((cInfo->EscCode[1] == '(') && (*Str == 'I'))\r
653                                 cInfo->KanjiMode = CONV_KANA;\r
654                         else if((cInfo->EscCode[1] == '(') && ((*Str == 'B') || (*Str == 'J') || (*Str == 'H')))\r
655                                 cInfo->KanjiMode = CONV_ASCII;\r
656                         else\r
657                         {\r
658                                 *Put++ = cInfo->EscCode[0];\r
659                                 *Put++ = cInfo->EscCode[1];\r
660                                 if((cInfo->KanjiMode == CONV_KANJI) && ((*Str >= 0x21) && (*Str <= 0x7E)))\r
661                                         cInfo->KanjiFst = *Str;\r
662                                 else\r
663                                         *Put++ = *Str;\r
664                         }\r
665                         Str++;\r
666                         cInfo->EscProc = 0;\r
667                 }\r
668         }\r
669 \r
670         cInfo->Str = Str;\r
671         cInfo->OutLen = Put - cInfo->Buf;\r
672 \r
673         return(Continue);\r
674 }\r
675 \r
676 \r
677 /*----- JIS-->SHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a·\82Ì\94¼\8ap\83J\83^\83J\83i\82Ì\8f\88\97\9d -------------------\r
678 *\r
679 *       Parameter\r
680 *               CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
681 *               char Dt : \95\8e\9a\r
682 *               char *Put : \83f\81[\83^\83Z\83b\83g\88Ê\92u\r
683 *\r
684 *       Return Value\r
685 *               char *\8e\9f\82Ì\83f\81[\83^\83Z\83b\83g\88Ê\92u\r
686 *----------------------------------------------------------------------------*/\r
687 \r
688 static char *ConvJIStoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)\r
689 {\r
690         int Kcode;\r
691         int Daku;\r
692 \r
693         Dt = (uchar)Dt + (uchar)0x80;\r
694         if(cInfo->KanaCnv == NO)\r
695         {\r
696                 if((uchar)Dt != (uchar)0x80)\r
697                         *Put++ = Dt;\r
698         }\r
699         else\r
700         {\r
701                 if(cInfo->KanaPrev != 0)\r
702                 {\r
703                         Daku = AskDakuon(cInfo->KanaPrev, Dt);\r
704                         Kcode = _mbcjistojms(HanKataToZen(cInfo->KanaPrev)) + Daku;\r
705                         *Put++ = HIGH8(Kcode);\r
706                         *Put++ = LOW8(Kcode);\r
707 \r
708                         if((Daku == 0) && ((uchar)Dt != (uchar)0x80))\r
709                                 cInfo->KanaPrev = Dt;\r
710                         else\r
711                                 cInfo->KanaPrev = 0;\r
712                 }\r
713                 else if((uchar)Dt != (uchar)0x80)\r
714                         cInfo->KanaPrev = Dt;\r
715         }\r
716         return(Put);\r
717 }\r
718 \r
719 \r
720 /*----- Samba-HEX/Samba-CAP\8a¿\8e\9a\83R\81[\83h\82ðSHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· --------------\r
721 *\r
722 *       Parameter\r
723 *               CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
724 *\r
725 *       Return Value\r
726 *               int \82­\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
727 *\r
728 *       Note\r
729 *               \82­\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
730 *               \95ª\8a\84\82³\82ê\82½\93ü\97Í\95\8e\9a\97ñ\82Ì\95Ï\8a·\82Í\83T\83|\81[\83g\82µ\82Ä\82¢\82È\82¢\r
731 *               \94¼\8ap\83J\83^\83J\83i\82Ì\95Ï\8a·\90Ý\92è\82É\82Í\91Î\89\9e\82µ\82Ä\82¢\82È\82¢\r
732 *----------------------------------------------------------------------------*/\r
733 \r
734 int ConvSMBtoSJIS(CODECONVINFO *cInfo)\r
735 {\r
736         char *Str;\r
737         char *Put;\r
738         char *Limit;\r
739         int Continue;\r
740 \r
741         Continue = NO;\r
742         Str = cInfo->Str;\r
743         Put = cInfo->Buf;\r
744         Limit = cInfo->Buf + cInfo->BufSize - 2;\r
745 \r
746         for(; cInfo->StrLen > 0; cInfo->StrLen--)\r
747         {\r
748                 if(Put >= Limit)\r
749                 {\r
750                         Continue = YES;\r
751                         break;\r
752                 }\r
753 \r
754                 if((*Str == SAMBA_HEX_TAG) && (cInfo->StrLen >= 3))\r
755                 {\r
756                         if(isxdigit(*(Str+1)) && isxdigit(*(Str+2)))\r
757                         {\r
758                                 *Put++ = N2INT(hex2bin(*(Str+1)), hex2bin(*(Str+2)));\r
759                                 Str += 3;\r
760                                 cInfo->StrLen -= 2;\r
761                         }\r
762                         else\r
763                                 *Put++ = *Str++;\r
764                 }\r
765                 else\r
766                         *Put++ = *Str++;\r
767         }\r
768 \r
769         cInfo->Str = Str;\r
770         cInfo->OutLen = Put - cInfo->Buf;\r
771 \r
772         return(Continue);\r
773 }\r
774 \r
775 \r
776 /*----- SHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82ðEUC\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------------\r
777 *\r
778 *       Parameter\r
779 *               CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
780 *\r
781 *       Return Value\r
782 *               int \82­\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
783 *\r
784 *       Note\r
785 *               \82­\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
786 *----------------------------------------------------------------------------*/\r
787 \r
788 int ConvSJIStoEUC(CODECONVINFO *cInfo)\r
789 {\r
790         int Kcode;\r
791         char *Str;\r
792         char *Put;\r
793         char *Limit;\r
794         int Continue;\r
795 \r
796         cInfo->KanaProc = &ConvSJIStoEUCkanaProc;\r
797 \r
798         Continue = NO;\r
799         Str = cInfo->Str;\r
800         Put = cInfo->Buf;\r
801         Limit = cInfo->Buf + cInfo->BufSize - 2;\r
802 \r
803         for(; cInfo->StrLen > 0; cInfo->StrLen--)\r
804         {\r
805                 if(Put >= Limit)\r
806                 {\r
807                         Continue = YES;\r
808                         break;\r
809                 }\r
810 \r
811                 if(cInfo->KanjiFst == 0)\r
812                 {\r
813                         if((((uchar)*Str >= (uchar)0x81) && ((uchar)*Str <= (uchar)0x9F)) ||\r
814                            ((uchar)*Str >= (uchar)0xE0))\r
815                         {\r
816                                 Put = ConvSJIStoEUCkanaProc(cInfo, 0, Put);\r
817                                 cInfo->KanjiFst = *Str++;\r
818                         }\r
819                         else if(((uchar)*Str >= (uchar)0xA0) && ((uchar)*Str <= (uchar)0xDF))\r
820                         {\r
821                                 Put = ConvSJIStoEUCkanaProc(cInfo, *Str++, Put);\r
822                         }\r
823                         else\r
824                         {\r
825                                 Put = ConvSJIStoEUCkanaProc(cInfo, 0, Put);\r
826                                 *Put++ = *Str++;\r
827                         }\r
828                 }\r
829                 else\r
830                 {\r
831                         if((uchar)*Str >= (uchar)0x40)\r
832                         {\r
833                                 Kcode = ConvertIBMExtendedChar(((uchar)cInfo->KanjiFst * 0x100) + (uchar)*Str++);\r
834                                 Kcode = _mbcjmstojis(Kcode);\r
835                                 *Put++ = HIGH8(Kcode) | 0x80;\r
836                                 *Put++ = LOW8(Kcode) | 0x80;\r
837                         }\r
838                         else\r
839                         {\r
840                                 *Put++ = cInfo->KanjiFst;\r
841                                 *Put++ = *Str++;\r
842                         }\r
843                         cInfo->KanjiFst = 0;\r
844                 }\r
845         }\r
846 \r
847         cInfo->Str = Str;\r
848         cInfo->OutLen = Put - cInfo->Buf;\r
849 \r
850         return(Continue);\r
851 }\r
852 \r
853 \r
854 /*----- SHIFT-JIS-->EUC\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a·\82Ì\94¼\8ap\83J\83^\83J\83i\82Ì\8f\88\97\9d -------------------\r
855 *\r
856 *       Parameter\r
857 *               CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
858 *               char Dt : \95\8e\9a\r
859 *               char *Put : \83f\81[\83^\83Z\83b\83g\88Ê\92u\r
860 *\r
861 *       Return Value\r
862 *               char *\8e\9f\82Ì\83f\81[\83^\83Z\83b\83g\88Ê\92u\r
863 *----------------------------------------------------------------------------*/\r
864 \r
865 static char *ConvSJIStoEUCkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)\r
866 {\r
867         int Kcode;\r
868         int Daku;\r
869 \r
870         if(cInfo->KanaCnv == NO)\r
871         {\r
872                 if(Dt != 0)\r
873                 {\r
874                         Kcode = 0x8E00 + (uchar)Dt;\r
875                         *Put++ = HIGH8(Kcode) | 0x80;\r
876                         *Put++ = LOW8(Kcode) | 0x80;\r
877                 }\r
878         }\r
879         else\r
880         {\r
881                 if(cInfo->KanaPrev != 0)\r
882                 {\r
883                         Daku = AskDakuon(cInfo->KanaPrev, Dt);\r
884                         Kcode = HanKataToZen(cInfo->KanaPrev) + Daku;\r
885                         *Put++ = HIGH8(Kcode) | 0x80;\r
886                         *Put++ = LOW8(Kcode) | 0x80;\r
887 \r
888                         if(Daku == 0)\r
889                                 cInfo->KanaPrev = Dt;\r
890                         else\r
891                                 cInfo->KanaPrev = 0;\r
892                 }\r
893                 else\r
894                         cInfo->KanaPrev = Dt;\r
895         }\r
896         return(Put);\r
897 }\r
898 \r
899 \r
900 /*----- SHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82ðJIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------------\r
901 *\r
902 *       Parameter\r
903 *               CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
904 *\r
905 *       Return Value\r
906 *               int \82­\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
907 *\r
908 *       Note\r
909 *               \82­\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
910 *\r
911 *               \83G\83X\83P\81[\83v\83R\81[\83h\82Í\81A\8e\9f\82Ì\82à\82Ì\82ð\8eg\97p\82·\82é\r
912 *                       \8a¿\8e\9a\8aJ\8en                <ESC>$B\r
913 *                       \94¼\8ap\83J\83i\8aJ\8en    <ESC>(I\r
914 *                       \8a¿\8e\9a\8fI\97¹                <ESC>(B\r
915 *----------------------------------------------------------------------------*/\r
916 \r
917 int ConvSJIStoJIS(CODECONVINFO *cInfo)\r
918 {\r
919         int Kcode;\r
920         char *Str;\r
921         char *Put;\r
922         char *Limit;\r
923         int Continue;\r
924 \r
925         cInfo->KanaProc = &ConvSJIStoJISkanaProc;\r
926 \r
927         Continue = NO;\r
928         Str = cInfo->Str;\r
929         Put = cInfo->Buf;\r
930         Limit = cInfo->Buf + cInfo->BufSize - 5;\r
931 \r
932         for(; cInfo->StrLen > 0; cInfo->StrLen--)\r
933         {\r
934                 if(Put >= Limit)\r
935                 {\r
936                         Continue = YES;\r
937                         break;\r
938                 }\r
939 \r
940                 if(cInfo->KanjiFst == 0)\r
941                 {\r
942                         if((((uchar)*Str >= (uchar)0x81) && ((uchar)*Str <= (uchar)0x9F)) ||\r
943                            ((uchar)*Str >= (uchar)0xE0))\r
944                         {\r
945                                 Put = ConvSJIStoJISkanaProc(cInfo, 0, Put);\r
946                                 cInfo->KanjiFst = *Str++;\r
947                         }\r
948                         else if(((uchar)*Str >= (uchar)0xA0) && ((uchar)*Str <= (uchar)0xDF))\r
949                         {\r
950                                 Put = ConvSJIStoJISkanaProc(cInfo, *Str++, Put);\r
951                         }\r
952                         else\r
953                         {\r
954                                 Put = ConvSJIStoJISkanaProc(cInfo, 0, Put);\r
955                                 if(cInfo->KanjiMode != CONV_ASCII)\r
956                                 {\r
957                                         *Put++ = 0x1B;\r
958                                         *Put++ = '(';\r
959                                         *Put++ = 'B';\r
960                                         cInfo->KanjiMode = CONV_ASCII;\r
961                                 }\r
962                                 *Put++ = *Str++;\r
963                         }\r
964                 }\r
965                 else\r
966                 {\r
967                         Put = ConvSJIStoJISkanaProc(cInfo, 0, Put);\r
968                         if((uchar)*Str >= (uchar)0x40)\r
969                         {\r
970                                 if(cInfo->KanjiMode != CONV_KANJI)\r
971                                 {\r
972                                         *Put++ = 0x1B;\r
973                                         *Put++ = '$';\r
974                                         *Put++ = 'B';\r
975                                         cInfo->KanjiMode = CONV_KANJI;\r
976                                 }\r
977 \r
978                                 Kcode = ConvertIBMExtendedChar(((uchar)cInfo->KanjiFst * 0x100) + (uchar)*Str++);\r
979                                 Kcode = _mbcjmstojis(Kcode);\r
980                                 *Put++ = HIGH8(Kcode);\r
981                                 *Put++ = LOW8(Kcode);\r
982                         }\r
983                         else\r
984                         {\r
985                                 if(cInfo->KanjiMode != CONV_ASCII)\r
986                                 {\r
987                                         *Put++ = 0x1B;\r
988                                         *Put++ = '(';\r
989                                         *Put++ = 'B';\r
990                                         cInfo->KanjiMode = CONV_ASCII;\r
991                                 }\r
992                                 *Put++ = cInfo->KanjiFst;\r
993                                 *Put++ = *Str++;\r
994                         }\r
995                         cInfo->KanjiFst = 0;\r
996                 }\r
997         }\r
998 \r
999         cInfo->Str = Str;\r
1000         cInfo->OutLen = Put - cInfo->Buf;\r
1001 \r
1002         return(Continue);\r
1003 }\r
1004 \r
1005 \r
1006 /*----- SHIFT-JIS-->JIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a·\82Ì\94¼\8ap\83J\83^\83J\83i\82Ì\8f\88\97\9d -------------------\r
1007 *\r
1008 *       Parameter\r
1009 *               CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
1010 *               char Dt : \95\8e\9a\r
1011 *               char *Put : \83f\81[\83^\83Z\83b\83g\88Ê\92u\r
1012 *\r
1013 *       Return Value\r
1014 *               char *\8e\9f\82Ì\83f\81[\83^\83Z\83b\83g\88Ê\92u\r
1015 *----------------------------------------------------------------------------*/\r
1016 \r
1017 static char *ConvSJIStoJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)\r
1018 {\r
1019         int Kcode;\r
1020         int Daku;\r
1021 \r
1022         if(cInfo->KanaCnv == NO)\r
1023         {\r
1024                 if(Dt != 0)\r
1025                 {\r
1026                         if(cInfo->KanjiMode != CONV_KANA)\r
1027                         {\r
1028                                 *Put++ = 0x1B;\r
1029                                 *Put++ = '(';\r
1030                                 *Put++ = 'I';\r
1031                                 cInfo->KanjiMode = CONV_KANA;\r
1032                         }\r
1033                         *Put++ = (uchar)Dt - (uchar)0x80;\r
1034                 }\r
1035         }\r
1036         else\r
1037         {\r
1038                 if(cInfo->KanaPrev != 0)\r
1039                 {\r
1040                         if(cInfo->KanjiMode != CONV_KANJI)\r
1041                         {\r
1042                                 *Put++ = 0x1B;\r
1043                                 *Put++ = '$';\r
1044                                 *Put++ = 'B';\r
1045                                 cInfo->KanjiMode = CONV_KANJI;\r
1046                         }\r
1047                         Daku = AskDakuon(cInfo->KanaPrev, Dt);\r
1048                         Kcode = HanKataToZen(cInfo->KanaPrev) + Daku;\r
1049                         *Put++ = HIGH8(Kcode);\r
1050                         *Put++ = LOW8(Kcode);\r
1051 \r
1052                         if(Daku == 0)\r
1053                                 cInfo->KanaPrev = Dt;\r
1054                         else\r
1055                                 cInfo->KanaPrev = 0;\r
1056                 }\r
1057                 else\r
1058                         cInfo->KanaPrev = Dt;\r
1059         }\r
1060         return(Put);\r
1061 }\r
1062 \r
1063 \r
1064 /*----- SHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82ðSamba-HEX\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------\r
1065 *\r
1066 *       Parameter\r
1067 *               CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
1068 *\r
1069 *       Return Value\r
1070 *               int \82­\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
1071 *\r
1072 *       Note\r
1073 *               \82­\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
1074 *               \95ª\8a\84\82³\82ê\82½\93ü\97Í\95\8e\9a\97ñ\82Ì\95Ï\8a·\82Í\83T\83|\81[\83g\82µ\82Ä\82¢\82È\82¢\r
1075 *               \94¼\8ap\83J\83^\83J\83i\82Ì\95Ï\8a·\90Ý\92è\82É\82Í\91Î\89\9e\82µ\82Ä\82¢\82È\82¢\r
1076 *----------------------------------------------------------------------------*/\r
1077 \r
1078 int ConvSJIStoSMB_HEX(CODECONVINFO *cInfo)\r
1079 {\r
1080         char *Str;\r
1081         char *Put;\r
1082         char *Limit;\r
1083         int Continue;\r
1084 \r
1085         Continue = NO;\r
1086         Str = cInfo->Str;\r
1087         Put = cInfo->Buf;\r
1088         Limit = cInfo->Buf + cInfo->BufSize - 6;\r
1089 \r
1090         for(; cInfo->StrLen > 0; cInfo->StrLen--)\r
1091         {\r
1092                 if(Put >= Limit)\r
1093                 {\r
1094                         Continue = YES;\r
1095                         break;\r
1096                 }\r
1097 \r
1098                 if((cInfo->StrLen >= 2) &&\r
1099                    ((((uchar)*Str >= (uchar)0x81) && ((uchar)*Str <= (uchar)0x9F)) ||\r
1100                     ((uchar)*Str >= (uchar)0xE0)))\r
1101                 {\r
1102                         sprintf(Put, "%c%02x%c%02x", SAMBA_HEX_TAG, (uchar)*Str, SAMBA_HEX_TAG, (uchar)*(Str+1));\r
1103                         Str += 2;\r
1104                         Put += 6;\r
1105                         cInfo->StrLen--;\r
1106                 }\r
1107                 else if((uchar)*Str >= (uchar)0x80)\r
1108                 {\r
1109                         sprintf(Put, "%c%02x", SAMBA_HEX_TAG, (uchar)*Str++);\r
1110                         Put += 3;\r
1111                 }\r
1112                 else\r
1113                         *Put++ = *Str++;\r
1114         }\r
1115 \r
1116         cInfo->Str = Str;\r
1117         cInfo->OutLen = Put - cInfo->Buf;\r
1118 \r
1119         return(Continue);\r
1120 }\r
1121 \r
1122 \r
1123 /*----- SHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82ðSamba-CAP\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------\r
1124 *\r
1125 *       Parameter\r
1126 *               CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
1127 *\r
1128 *       Return Value\r
1129 *               int \82­\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
1130 *\r
1131 *       Note\r
1132 *               \82­\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
1133 *               \95ª\8a\84\82³\82ê\82½\93ü\97Í\95\8e\9a\97ñ\82Ì\95Ï\8a·\82Í\83T\83|\81[\83g\82µ\82Ä\82¢\82È\82¢\r
1134 *----------------------------------------------------------------------------*/\r
1135 \r
1136 int ConvSJIStoSMB_CAP(CODECONVINFO *cInfo)\r
1137 {\r
1138         char *Str;\r
1139         char *Put;\r
1140         char *Limit;\r
1141         int Continue;\r
1142 \r
1143         Continue = NO;\r
1144         Str = cInfo->Str;\r
1145         Put = cInfo->Buf;\r
1146         Limit = cInfo->Buf + cInfo->BufSize - 6;\r
1147 \r
1148         for(; cInfo->StrLen > 0; cInfo->StrLen--)\r
1149         {\r
1150                 if(Put >= Limit)\r
1151                 {\r
1152                         Continue = YES;\r
1153                         break;\r
1154                 }\r
1155 \r
1156                 if((uchar)*Str >= (uchar)0x80)\r
1157                 {\r
1158                         sprintf(Put, "%c%02x", SAMBA_HEX_TAG, (uchar)*Str++);\r
1159                         Put += 3;\r
1160                 }\r
1161                 else\r
1162                         *Put++ = *Str++;\r
1163         }\r
1164 \r
1165         cInfo->Str = Str;\r
1166         cInfo->OutLen = Put - cInfo->Buf;\r
1167 \r
1168         return(Continue);\r
1169 }\r
1170 \r
1171 \r
1172 /*----- \82P\83o\83C\83g\83J\83^\83J\83i\82ðJIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ---------------------------------\r
1173 *\r
1174 *       Parameter\r
1175 *               char Ch : \82P\83o\83C\83g\83J\83^\83J\83i\83R\81[\83h\r
1176 *\r
1177 *       Return Value\r
1178 *               int JIS\8a¿\8e\9a\83R\81[\83h\r
1179 *----------------------------------------------------------------------------*/\r
1180 \r
1181 static int HanKataToZen(char Ch)\r
1182 {\r
1183         static const int Katakana[] = {\r
1184                 0x2121, 0x2123, 0x2156, 0x2157, 0x2122, 0x2126, 0x2572, 0x2521, \r
1185                 0x2523, 0x2525, 0x2527, 0x2529, 0x2563, 0x2565, 0x2567, 0x2543, \r
1186                 0x213C, 0x2522, 0x2524, 0x2526, 0x2528, 0x252A, 0x252B, 0x252D, \r
1187                 0x252F, 0x2531, 0x2533, 0x2535, 0x2537, 0x2539, 0x253B, 0x253D, \r
1188                 0x253F, 0x2541, 0x2544, 0x2546, 0x2548, 0x254A, 0x254B, 0x254C, \r
1189                 0x254D, 0x254E, 0x254F, 0x2552, 0x2555, 0x2558, 0x255B, 0x255E, \r
1190                 0x255F, 0x2560, 0x2561, 0x2562, 0x2564, 0x2566, 0x2568, 0x2569, \r
1191                 0x256A, 0x256B, 0x256C, 0x256D, 0x256F, 0x2573, 0x212B, 0x212C\r
1192         };\r
1193 \r
1194         return(Katakana[(uchar)Ch - (uchar)0xA0]);\r
1195 }\r
1196 \r
1197 \r
1198 /*----- \91÷\89¹\81^\94¼\91÷\89¹\82É\82È\82é\95\8e\9a\82©\83`\83F\83b\83N --------------------------------------\r
1199 *\r
1200 *       Parameter\r
1201 *               char Ch : \82P\83o\83C\83g\83J\83^\83J\83i\83R\81[\83h\r
1202 *               char Daku : \91÷\93_\81^\94¼\91÷\93_\r
1203 *\r
1204 *       Return Value\r
1205 *               int \95\8e\9a\83R\81[\83h\82É\89Á\82¦\82é\92l (0=\91÷\89¹\81^\94¼\91÷\89¹\82É\82È\82ç\82È\82¢)\r
1206 *----------------------------------------------------------------------------*/\r
1207 \r
1208 static int AskDakuon(char Ch, char Daku)\r
1209 {\r
1210         int Ret;\r
1211 \r
1212         Ret = 0;\r
1213         if((uchar)Daku == (uchar)0xDE)\r
1214         {\r
1215                 if((((uchar)Ch >= (uchar)0xB6) && ((uchar)Ch <= (uchar)0xC4)) ||\r
1216                    (((uchar)Ch >= (uchar)0xCA) && ((uchar)Ch <= (uchar)0xCE)))\r
1217                 {\r
1218                         Ret = 1;\r
1219                 }\r
1220         }\r
1221         else if((uchar)Daku == (uchar)0xDF)\r
1222         {\r
1223                 if(((uchar)Ch >= (uchar)0xCA) && ((uchar)Ch <= (uchar)0xCE))\r
1224                 {\r
1225                         Ret = 2;\r
1226                 }\r
1227         }\r
1228         return(Ret);\r
1229 }\r
1230 \r
1231 \r
1232 \r
1233 \r
1234 \r
1235 \r
1236 \r
1237 \r
1238 \r
1239 \r
1240 \r
1241 \r
1242 /*----- \95\8e\9a\97ñ\82Ì\8a¿\8e\9a\83R\81[\83h\82ð\92²\82×\81AShift-JIS\82É\95Ï\8a· -----------------------------\r
1243 *\r
1244 *       Parameter\r
1245 *               char *Text : \95\8e\9a\97ñ\r
1246 *               int Pref : SJIS/EUC\82Ì\97D\90æ\8ew\92è\r
1247 \81\96                      KANJI_SJIS / KANJI_EUC / KANJI_NOCNV=SJIS/EUC\82Ì\83`\83F\83b\83N\82Í\82µ\82È\82¢\r
1248 *\r
1249 *       Return Value\r
1250 *               \82È\82µ\r
1251 *----------------------------------------------------------------------------*/\r
1252 \r
1253 void ConvAutoToSJIS(char *Text, int Pref)\r
1254 {\r
1255         int Code;\r
1256         char *Buf;\r
1257         CODECONVINFO cInfo;\r
1258 \r
1259         Code = CheckKanjiCode(Text, strlen(Text), Pref);\r
1260         if(Code != KANJI_SJIS)\r
1261         {\r
1262                 Buf = malloc(strlen(Text)+1);\r
1263                 if(Buf != NULL)\r
1264                 {\r
1265                         InitCodeConvInfo(&cInfo);\r
1266                         cInfo.KanaCnv = NO;\r
1267                         cInfo.Str = Text;\r
1268                         cInfo.StrLen = strlen(Text);\r
1269                         cInfo.Buf = Buf;\r
1270                         cInfo.BufSize = strlen(Text);\r
1271 \r
1272                         switch(Code)\r
1273                         {\r
1274                                 case KANJI_JIS :\r
1275                                         ConvJIStoSJIS(&cInfo);\r
1276                                         break;\r
1277 \r
1278                                 case KANJI_EUC :\r
1279                                         ConvEUCtoSJIS(&cInfo);\r
1280                                         break;\r
1281                         }\r
1282 \r
1283                         *(Buf + cInfo.OutLen) = NUL;\r
1284                         strcpy(Text, Buf);\r
1285                         free(Buf);\r
1286                 }\r
1287         }\r
1288         return;\r
1289 }\r
1290 \r
1291 \r
1292 /*----- \8eg\82í\82ê\82Ä\82¢\82é\8a¿\8e\9a\83R\81[\83h\82ð\92²\82×\82é ----------------------------------------\r
1293 *\r
1294 *       Parameter\r
1295 *               char *Text : \95\8e\9a\97ñ\r
1296 *               int Size : \95\8e\9a\97ñ\82Ì\92·\82³\r
1297 *               int Pref : SJIS/EUC\82Ì\97D\90æ\8ew\92è\r
1298 \81\96                      KANJI_SJIS / KANJI_EUC / KANJI_NOCNV=SJIS/EUC\82Ì\83`\83F\83b\83N\82Í\82µ\82È\82¢\r
1299 *\r
1300 *       Return Value\r
1301 *               int \8a¿\8e\9a\83R\81[\83h (KANJI_xxx)\r
1302 *----------------------------------------------------------------------------*/\r
1303 \r
1304 int CheckKanjiCode(char *Text, int Size, int Pref)\r
1305 {\r
1306         uchar *Pos;\r
1307         uchar *Btm;\r
1308         int Ret;\r
1309         int PointSJIS;\r
1310         int PointEUC;\r
1311 \r
1312         Ret = KANJI_SJIS;\r
1313         if(Size >= 2)\r
1314         {\r
1315                 Ret = -1;\r
1316                 Btm = Text + Size;\r
1317 \r
1318                 /* JIS\8a¿\8e\9a\83R\81[\83h\82Ì\83`\83F\83b\83N */\r
1319                 Pos = Text;\r
1320                 while((Pos = memchr(Pos, 0x1b, Btm-Pos-2)) != NULL)\r
1321                 {\r
1322                         Pos++;\r
1323                         if((memcmp(Pos, "$B", 2) == 0) ||       /* <ESC>$B */\r
1324                            (memcmp(Pos, "$@", 2) == 0) ||       /* <ESC>$@ */\r
1325                            (memcmp(Pos, "(I", 2) == 0))         /* <ESC>(I */\r
1326                         {\r
1327                                 Ret = KANJI_JIS;\r
1328                                 break;\r
1329                         }\r
1330                 }\r
1331 \r
1332                 /* EUC\82ÆSHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82Ì\83`\83F\83b\83N */\r
1333                 if(Ret == -1)\r
1334                 {\r
1335                         if(Pref != KANJI_NOCNV)\r
1336                         {\r
1337                                 Ret = Pref;\r
1338                                 Pos = Text;\r
1339                                 while(Pos < Btm)\r
1340                                 {\r
1341                                         PointSJIS = CheckOnSJIS(Pos, Btm);\r
1342                                         PointEUC = CheckOnEUC(Pos, Btm);\r
1343                                         if(PointSJIS > PointEUC)\r
1344                                         {\r
1345                                                 Ret = KANJI_SJIS;\r
1346                                                 break;\r
1347                                         }\r
1348                                         if(PointSJIS < PointEUC)\r
1349                                         {\r
1350                                                 Ret = KANJI_EUC;\r
1351                                                 break;\r
1352                                         }\r
1353                                         if((Pos = memchr(Pos, '\n', Btm-Pos)) == NULL)\r
1354                                                 break;\r
1355                                         Pos++;\r
1356                                 }\r
1357                         }\r
1358                         else\r
1359                                 Ret = KANJI_SJIS;\r
1360                 }\r
1361         }\r
1362         return(Ret);\r
1363 }\r
1364 \r
1365 \r
1366 /*----- SHIFT-JIS\83R\81[\83h\82Ì\89Â\94\\90«\82ª\82 \82é\82©\83`\83F\83b\83N --------------------------------\r
1367 *\r
1368 *       Parameter\r
1369 *               uchar *Pos : \95\8e\9a\97ñ\r
1370 *               uchar *Btm : \95\8e\9a\97ñ\82Ì\96\96\94ö\r
1371 *\r
1372 *       Return Value\r
1373 *               int \93¾\93_\r
1374 *\r
1375 *       Note\r
1376 *               High    81-FF (A0-DF\82Í\94¼\8ap)     (EB\88È\8d~\82Í\82Ù\82Æ\82ñ\82Ç\96³\82¢)\r
1377 *               Low             40-FC\r
1378 *----------------------------------------------------------------------------*/\r
1379 \r
1380 static int CheckOnSJIS(uchar *Pos, uchar *Btm)\r
1381 {\r
1382         int FstOnTwo;\r
1383         int Point;\r
1384 \r
1385         FstOnTwo = NO;\r
1386         Point = 100;\r
1387         while((Point > 0) && (Pos < Btm) && (*Pos != '\n'))\r
1388         {\r
1389                 if(FstOnTwo == YES)\r
1390                 {\r
1391                         if((*Pos < 0x40) || (*Pos > 0xFC))      /* 2\83o\83C\83g\96Ú\82Í 0x40\81`0xFC */\r
1392                                 Point = 0;\r
1393                         FstOnTwo = NO;\r
1394                 }\r
1395                 else if(*Pos >= 0x81)\r
1396                 {\r
1397                         if((*Pos < 0xA0) || (*Pos > 0xDF))      /* \94¼\8ap\83J\83i\82Å\82È\82¯\82ê\82Π*/\r
1398                         {\r
1399                                 if(*Pos >= 0xEB)                /* 1\83o\83C\83g\96Ú\82Í0xEB\88È\8d~\82Í\82Ù\82Æ\82ñ\82Ç\96³\82¢ */\r
1400                                         Point -= 50;\r
1401                                 FstOnTwo = YES;\r
1402                         }\r
1403                 }\r
1404                 Pos++;\r
1405         }\r
1406         if(FstOnTwo == YES)             /* \82P\83o\83C\83g\96Ú\82Å\8fI\82í\82Á\82Ä\82¢\82é\82Ì\82Í\82¨\82©\82µ\82¢  */\r
1407                 Point = 0;\r
1408 \r
1409         return(Point);\r
1410 }\r
1411 \r
1412 \r
1413 /*----- EUC\83R\81[\83h\82Ì\89Â\94\\90«\82ª\82 \82é\82©\83`\83F\83b\83N -------------------------------------\r
1414 *\r
1415 *       Parameter\r
1416 *               uchar *Pos : \95\8e\9a\97ñ\r
1417 *               uchar *Btm : \95\8e\9a\97ñ\82Ì\96\96\94ö\r
1418 *\r
1419 *       Return Value\r
1420 *               int \93¾\93_\r
1421 *\r
1422 *       Note\r
1423 *               High    A1-FE , 8E\r
1424 *               Low             A1-FE\r
1425 *----------------------------------------------------------------------------*/\r
1426 \r
1427 static int CheckOnEUC(uchar *Pos, uchar *Btm)\r
1428 {\r
1429         int FstOnTwo;\r
1430         int Point;\r
1431 \r
1432         FstOnTwo = 0;\r
1433         Point = 100;\r
1434         while((Point > 0) && (Pos < Btm) && (*Pos != '\n'))\r
1435         {\r
1436                 if(FstOnTwo == 1)\r
1437                 {\r
1438                         if((*Pos < 0xA1) || (*Pos > 0xFE))      /* 2\83o\83C\83g\96Ú\82Í 0xA1\81`0xFE */\r
1439                                 Point = 0;\r
1440                         FstOnTwo = 0;\r
1441                 }\r
1442                 else if(FstOnTwo == 2)          /* \94¼\8ap\83J\83i */\r
1443                 {\r
1444                         if((*Pos < 0xA0) || (*Pos > 0xDF))      /* 2\83o\83C\83g\96Ú\82Í 0xA0\81`0xDF */\r
1445                                 Point = 0;\r
1446                         FstOnTwo = 0;\r
1447                 }\r
1448                 else\r
1449                 {\r
1450                         if(*Pos == 0x8E)                /* 0x8E??\82Í\94¼\8ap\83J\83i */\r
1451                                 FstOnTwo = 2;\r
1452                         else if((*Pos >= 0xA1) && (*Pos <= 0xFE))\r
1453                                 FstOnTwo = 1;\r
1454                 }\r
1455                 Pos++;\r
1456         }\r
1457         if(FstOnTwo != 0)               /* \82P\83o\83C\83g\96Ú\82Å\8fI\82í\82Á\82Ä\82¢\82é\82Ì\82Í\82¨\82©\82µ\82¢  */\r
1458                 Point = 0;\r
1459 \r
1460         return(Point);\r
1461 }\r
1462 \r
1463 \r
1464 // UTF-8N\91Î\89\9e \82±\82±\82©\82ç\81«\r
1465 /*----- UTF-8N\8a¿\8e\9a\83R\81[\83h\82ðSHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------------\r
1466 *\r
1467 *       Parameter\r
1468 *               CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
1469 *\r
1470 *       Return Value\r
1471 *               int \82­\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
1472 *\r
1473 *       Note\r
1474 *               \82­\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
1475 *----------------------------------------------------------------------------*/\r
1476 \r
1477 int ConvUTF8NtoSJIS(CODECONVINFO *cInfo)\r
1478 {\r
1479         int Continue;\r
1480 \r
1481         char temp_string[2048];\r
1482         int string_length;\r
1483 \r
1484         Continue = NO;\r
1485 \r
1486         // \90\90¬\82³\82ê\82é\92\86\8aÔ\83R\81[\83h\82Ì\83T\83C\83Y\82ð\92²\82×\82é\r
1487         string_length = MultiByteToWideChar(\r
1488                                                 CP_UTF8,                // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
1489                                                 0,                              // \83t\83\89\83O(0:\82È\82µ)\r
1490                                                 cInfo->Str,             // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
1491                                                 -1,                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
1492                                                 NULL,                   // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
1493                                                 0                               // \8ai\94[\90æ\83T\83C\83Y\r
1494                                         );\r
1495 \r
1496         // \83T\83C\83Y0 or \83o\83b\83t\83@\83T\83C\83Y\82æ\82è\91å\82«\82¢\8fê\8d\87\82Í\r
1497         // cInfo->Buf\82Ì\8dÅ\8f\89\82É'\0'\82ð\93ü\82ê\82Ä\81A\r
1498         // cInfo->BufSize\82É0\82ð\93ü\82ê\82Ä\95Ô\82·\81B\r
1499         if( string_length == 0 ||\r
1500                 string_length >= 1024 ){\r
1501                 *(cInfo->Buf) = '\0';\r
1502                 cInfo->BufSize = 0;\r
1503                 return(Continue);\r
1504         }\r
1505 \r
1506         // \92\86\8aÔ\83R\81[\83h(unicode)\82É\95Ï\8a·\r
1507         MultiByteToWideChar(\r
1508                 CP_UTF8,                                                // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
1509                 0,                                                              // \83t\83\89\83O(0:\82È\82µ)\r
1510                 cInfo->Str,                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
1511                 -1,                                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
1512                 (unsigned short *)temp_string,  // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
1513                 1024                                                    // \8ai\94[\90æ\83T\83C\83Y\r
1514         );\r
1515 \r
1516         // \90\90¬\82³\82ê\82éUTF-8\83R\81[\83h\82Ì\83T\83C\83Y\82ð\92²\82×\82é\r
1517         string_length = WideCharToMultiByte(\r
1518                                                 CP_ACP,                 // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
1519                                                 0,                              // \83t\83\89\83O(0:\82È\82µ)\r
1520                                                 (unsigned short *)temp_string,  // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
1521                                                 -1,                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
1522                                                 NULL,                   // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
1523                                                 0,                              // \8ai\94[\90æ\83T\83C\83Y\r
1524                                                 NULL,NULL\r
1525                                         );\r
1526 \r
1527         // \83T\83C\83Y0 or \8fo\97Í\83o\83b\83t\83@\83T\83C\83Y\82æ\82è\91å\82«\82¢\8fê\8d\87\82Í\81A\r
1528         // cInfo->Buf\82Ì\8dÅ\8f\89\82É'\0'\82ð\93ü\82ê\82Ä\81A\r
1529         // cInfo->BufSize\82É0\82ð\93ü\82ê\82Ä\95Ô\82·\81B\r
1530         if( string_length == 0 ||\r
1531                 string_length >= cInfo->BufSize ){\r
1532                 *(cInfo->Buf) = '\0';\r
1533                 cInfo->BufSize = 0;\r
1534                 return(Continue);\r
1535         }\r
1536 \r
1537         // \8fo\97Í\83T\83C\83Y\82ð\90Ý\92è\r
1538         cInfo->OutLen = string_length;\r
1539 \r
1540         // UTF-8\83R\81[\83h\82É\95Ï\8a·\r
1541         WideCharToMultiByte(\r
1542                 CP_ACP,                                                 // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
1543                 0,                                                              // \83t\83\89\83O(0:\82È\82µ)\r
1544                 (unsigned short *)temp_string,  // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
1545                 -1,                                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
1546                 cInfo->Buf,                                             // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ(BOM:3bytes)\r
1547                 cInfo->BufSize,                                 // \8ai\94[\90æ\83T\83C\83Y\r
1548                 NULL,NULL\r
1549         );\r
1550 \r
1551         return(Continue);\r
1552 }\r
1553 \r
1554 /*----- SHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82ðUTF-8N\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------------\r
1555 *\r
1556 *       Parameter\r
1557 *               CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
1558 *\r
1559 *       Return Value\r
1560 *               int \82­\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
1561 *\r
1562 *       Note\r
1563 *               \82­\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
1564 *----------------------------------------------------------------------------*/\r
1565 int ConvSJIStoUTF8N(CODECONVINFO *cInfo)\r
1566 {\r
1567         int Continue;\r
1568 \r
1569         char temp_string[2048];\r
1570         int string_length;\r
1571 \r
1572         Continue = NO;\r
1573 \r
1574         // \90\90¬\82³\82ê\82é\92\86\8aÔ\83R\81[\83h\82Ì\83T\83C\83Y\82ð\92²\82×\82é\r
1575         string_length = MultiByteToWideChar(\r
1576                                                 CP_ACP,                 // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
1577                                                 0,                              // \83t\83\89\83O(0:\82È\82µ)\r
1578                                                 cInfo->Str,             // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
1579                                                 -1,                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
1580                                                 NULL,                   // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
1581                                                 0                               // \8ai\94[\90æ\83T\83C\83Y\r
1582                                         );\r
1583 \r
1584         // \83T\83C\83Y0 or \83o\83b\83t\83@\83T\83C\83Y\82æ\82è\91å\82«\82¢\8fê\8d\87\82Í\81A\r
1585         // cInfo->Buf\82Ì\8dÅ\8f\89\82É'\0'\82ð\93ü\82ê\82Ä\81A\r
1586         // cInfo->BufSize\82É0\82ð\93ü\82ê\82Ä\95Ô\82·\81B\r
1587         if( string_length == 0 ||\r
1588                 string_length >= 1024 ){\r
1589                 *(cInfo->Buf) = '\0';\r
1590                 cInfo->BufSize = 0;\r
1591                 return(Continue);\r
1592         }\r
1593 \r
1594         // \92\86\8aÔ\83R\81[\83h(unicode)\82É\95Ï\8a·\r
1595         MultiByteToWideChar(\r
1596                 CP_ACP,                                                 // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
1597                 0,                                                              // \83t\83\89\83O(0:\82È\82µ)\r
1598                 cInfo->Str,                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
1599                 -1,                                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
1600                 (unsigned short *)temp_string,  // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
1601                 1024                                                    // \8ai\94[\90æ\83T\83C\83Y\r
1602         );\r
1603 \r
1604         // \90\90¬\82³\82ê\82éUTF-8\83R\81[\83h\82Ì\83T\83C\83Y\82ð\92²\82×\82é\r
1605         string_length = WideCharToMultiByte(\r
1606                                                 CP_UTF8,                // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
1607                                                 0,                              // \83t\83\89\83O(0:\82È\82µ)\r
1608                                                 (unsigned short *)temp_string,  // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
1609                                                 -1,                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
1610                                                 NULL,                   // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
1611                                                 0,                              // \8ai\94[\90æ\83T\83C\83Y\r
1612                                                 NULL,NULL\r
1613                                         );\r
1614 \r
1615         // \83T\83C\83Y0 or \8fo\97Í\83o\83b\83t\83@\83T\83C\83Y\82æ\82è\91å\82«\82¢\8fê\8d\87\82Í\81A\r
1616         // cInfo->Buf\82Ì\8dÅ\8f\89\82É'\0'\82ð\93ü\82ê\82Ä\81A\r
1617         // cInfo->BufSize\82É0\82ð\93ü\82ê\82Ä\95Ô\82·\81B\r
1618         if( string_length == 0 ||\r
1619                 string_length >= cInfo->BufSize ){\r
1620                 *(cInfo->Buf) = '\0';\r
1621                 cInfo->BufSize = 0;\r
1622                 return(Continue);\r
1623         }\r
1624 \r
1625         // \8fo\97Í\83T\83C\83Y\82ð\90Ý\92è\r
1626         cInfo->OutLen = string_length;\r
1627 \r
1628         /*\r
1629         // \81«\95t\82¯\82¿\82á\82¾\82ß \83R\83}\83\93\83h\82É\82à\92Ç\89Á\82³\82ê\82Ä\82µ\82Ü\82¤\r
1630         // \8fo\97Í\95\8e\9a\97ñ\82Ì\90æ\93ª\82ÉBOM(byte order mark)\82ð\82Â\82¯\82é\r
1631         *(cInfo->Buf) = (char)0xef;\r
1632         *(cInfo->Buf+1) = (char)0xbb;\r
1633         *(cInfo->Buf+2) = (char)0xbf;\r
1634         */\r
1635 \r
1636         // UTF-8\83R\81[\83h\82É\95Ï\8a·\r
1637         WideCharToMultiByte(\r
1638                 CP_UTF8,                                                // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
1639                 0,                                                              // \83t\83\89\83O(0:\82È\82µ)\r
1640                 (unsigned short *)temp_string,  // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
1641                 -1,                                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
1642                 cInfo->Buf,                                     // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ(BOM:3bytes)\r
1643                 cInfo->BufSize,                                 // \8ai\94[\90æ\83T\83C\83Y\r
1644                 NULL,NULL\r
1645         );\r
1646 \r
1647         return(Continue);\r
1648 }\r
1649 // UTF-8N\91Î\89\9e \82±\82±\82Ü\82Å\81ª\r
1650 \r
1651 \r
1652 /*----- IBM\8ag\92£\8a¿\8e\9a\82ðNEC\91I\92èIBM\8ag\92£\8a¿\8e\9a\93\99\82É\95Ï\8a· -------------------------------\r
1653 *\r
1654 *       Parameter\r
1655 *               code    \8a¿\8e\9a\83R\81[\83h\r
1656 *\r
1657 *       Return Value\r
1658 *               int \8a¿\8e\9a\83R\81[\83h\r
1659 *----------------------------------------------------------------------------*/\r
1660 static int ConvertIBMExtendedChar(int code)\r
1661 {\r
1662         if((code >= 0xfa40) && (code <= 0xfa49))                code -= (0xfa40 - 0xeeef);\r
1663         else if((code >= 0xfa4a) && (code <= 0xfa53))   code -= (0xfa4a - 0x8754);\r
1664         else if((code >= 0xfa54) && (code <= 0xfa57))   code -= (0xfa54 - 0xeef9);\r
1665         else if(code == 0xfa58)                                                 code = 0x878a;\r
1666         else if(code == 0xfa59)                                                 code = 0x8782;\r
1667         else if(code == 0xfa5a)                                                 code = 0x8784;\r
1668         else if(code == 0xfa5b)                                                 code = 0x879a;\r
1669         else if((code >= 0xfa5c) && (code <= 0xfa7e))   code -= (0xfa5c - 0xed40);\r
1670         else if((code >= 0xfa80) && (code <= 0xfa9b))   code -= (0xfa80 - 0xed63);\r
1671         else if((code >= 0xfa9c) && (code <= 0xfafc))   code -= (0xfa9c - 0xed80);\r
1672         else if((code >= 0xfb40) && (code <= 0xfb5b))   code -= (0xfb40 - 0xede1);\r
1673         else if((code >= 0xfb5c) && (code <= 0xfb7e))   code -= (0xfb5c - 0xee40);\r
1674         else if((code >= 0xfb80) && (code <= 0xfb9b))   code -= (0xfb80 - 0xee63);\r
1675         else if((code >= 0xfb9c) && (code <= 0xfbfc))   code -= (0xfb9c - 0xee80);\r
1676         else if((code >= 0xfc40) && (code <= 0xfc4b))   code -= (0xfc40 - 0xeee1);\r
1677         return code;\r
1678 }\r
1679 \r