Mercurial > kinput2.yaz
diff sj3def/jcode.c @ 0:92745d501b9a
initial import from kinput2-v3.1
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Mon, 08 Mar 2010 04:44:30 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sj3def/jcode.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,173 @@ +#ifndef lint +static char *rcsid = "$Id: jcode.c,v 2.3 1993/09/22 11:04:10 nao Exp $"; +#endif +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#include <stdio.h> +#ifdef X_LOCALE +#include <X11/Xlocale.h> +#else /* X_LOCALE */ +#include <locale.h> +#endif /* X_LOCALE */ +#include "common.h" + +int code, kana; +enum { ASCII, KANJI, GAIJI } g0; + +main(argc, argv) + int argc; + char **argv; +{ + char *locale; + register FILE *in, *out; + unsigned char ibuf[BUFSIZ], obuf[BUFSIZ]; + +#ifdef X_LOCALE + if (locale = _Xsetlocale(LC_CTYPE, "")) +#else /* X_LOCALE */ + if (locale = setlocale(LC_CTYPE, "")) +#endif /* X_LOCALE */ + if (!strcmp(locale, "ja_JP.SJIS")||!strcmp(locale, "ja_JP.mscode")) + code = JP_SJIS; + else if (!strcmp(locale, "ja_JP.jis7")) code = JP_JIS7; + else if (!strcmp(locale, "ja_JP.jis8")) code = JP_JIS8; + else code = JP_EUC; + else code = JP_EUC; +#ifdef FORCE_SJIS + code = JP_SJIS; +#endif +#ifdef FORCE_JIS8 + code = JP_JIS8; +#endif +#ifdef FORCE_JIS7 + code = JP_JIS7; +#endif + if (argc < 2) { + in = stdin; + out = stdout; + } else { + if ((in = fopen (*(++argv), "r")) == NULL) { + perror (*argv); + exit (1); + } + out = stdout; + } + if (code == JP_EUC) + while (fgets((char *)ibuf, BUFSIZ, in) != NULL) + fputs((char *)ibuf, out); + else { + g0 = ASCII; + kana = OFF; + while (fgets((char *)ibuf, BUFSIZ, in) != NULL) { + conv(ibuf, obuf); + fputs((char *)obuf, out); + putc('\n', out); + } + } + exit(0); +} + +int +conv(p, q) + register unsigned char *p, *q; +{ + wchar c; + + while (*p != '\n' && *p != '\0') { + if (*p & 0x80) { + if (*p == SS2) { + p++; + if (code != JP_SJIS && g0 != ASCII) { + g0 = ASCII; + *q++ = ESC; *q++ = '('; *q++ = 'J'; + } + if (code == JP_JIS7) { + if (!kana) { + *q++ = SO; + kana++; + } + *q++ = *p++ & MASK; + } else { + *q++ = *p++; + } + } else if (*p == SS3) { + if (code == JP_JIS7 && kana) { + *q++ = SI; + kana = OFF; + } + if (code != JP_SJIS) { + if (g0 != GAIJI) { + g0 = GAIJI; + *q++ = ESC; *q++ = '$'; *q++ = '('; *q++ = 'D'; + } + *q++ = (*p++ & MASK); *q++ = (*p++ & MASK); + } else { + if (*p < 0x3b) { + c = (*p << 8) | *(p + 1); p += 2; + c = _Xsj3ceuc2sjis(c); + *q++ = (c >> 8) + 0x6f; *q++ = c & 0xff; + } else { + *q++ = 0xfc; *q++ = 0xfc; + } + } + } else { + if (code == JP_JIS7 && kana) { + *q++ = SI; + kana = OFF; + } + if (code != JP_SJIS) { + if (g0 != KANJI) { + g0 = KANJI; + *q++ = ESC; *q++ = '$'; *q++ = 'B'; + } + *q++ = (*p++ & MASK); *q++ = (*p++ & MASK); + } else { + c = (*p << 8) | *(p + 1); p += 2; + c = _Xsj3ceuc2sjis(c); + *q++ = c >> 8; *q++ = c & 0xff; + } + } + } else { + if (code == JP_JIS7 && kana) { + *q++ = SI; + kana = OFF; + } + if (code != JP_SJIS && g0 != ASCII) { + g0 = ASCII; + *q++ = ESC; *q++ = '('; *q++ = 'J'; + } + *q++ = *p++; + } + } + if (code == JP_JIS7 && kana) { + *q++ = SI; + kana = OFF; + } + if (code != JP_SJIS && g0 != ASCII) { + g0 = ASCII; + *q++ = ESC; *q++ = '('; *q++ = 'J'; + } + *q = '\0'; +}