[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemacs-commit] qemacs charsetjis.c jistoqe.c
From: |
Charlie Gordon |
Subject: |
[Qemacs-commit] qemacs charsetjis.c jistoqe.c |
Date: |
Mon, 03 Dec 2007 16:16:24 +0000 |
CVSROOT: /cvsroot/qemacs
Module name: qemacs
Changes by: Charlie Gordon <chqrlie> 07/12/03 16:16:24
Added files:
. : charsetjis.c jistoqe.c
Log message:
added charsetjis.c and charsetjis.def
moved code from charsetmore.c to charset.c and charsetjis.c
separate JIS table generation into jistoqe.c, make it generate
charsetjis.def
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/qemacs/charsetjis.c?cvsroot=qemacs&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/qemacs/jistoqe.c?cvsroot=qemacs&rev=1.1
Patches:
Index: charsetjis.c
===================================================================
RCS file: charsetjis.c
diff -N charsetjis.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ charsetjis.c 3 Dec 2007 16:16:24 -0000 1.1
@@ -0,0 +1,238 @@
+/*
+ * JIS Charset handling for QEmacs
+ *
+ * Copyright (c) 2002 Fabrice Bellard.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "qe.h"
+
+#include "charsetjis.def"
+
+static int jis0208_decode(int b1, int b2)
+{
+ b1 -= 0x21;
+ b2 -= 0x21;
+ if (b1 > 83)
+ return 0;
+ if (b1 < 8) {
+ /* do nothing */
+ } else if (b1 <= 14) {
+ return 0;
+ } else {
+ b1 -= 7;
+ }
+ return table_jis208[b1 * 94 + b2];
+}
+
+static int jis0212_decode(int b1, int b2)
+{
+ b1 -= 0x21;
+ b2 -= 0x21;
+
+ if (b1 > 76)
+ return 0;
+
+ switch (b1) {
+ case 0:
+ case 2:
+ case 3:
+ case 4:
+ case 7:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ return 0;
+ case 1:
+ b1 = 0;
+ break;
+ case 5:
+ case 6:
+ b1 = b1 - 5 + 1;
+ break;
+ case 8:
+ case 9:
+ case 10:
+ b1 = b1 - 8 + 3;
+ break;
+ default:
+ b1 = b1 - 15 + 6;
+ break;
+ }
+ return table_jis212[b1 * 94 + b2];
+}
+
+static void decode_euc_jp_init(CharsetDecodeState *s)
+{
+ unsigned short *table = s->table;
+ int i;
+
+ for (i = 0; i < 256; i++)
+ table[i] = i;
+ table[0x8e] = ESCAPE_CHAR;
+ table[0x8f] = ESCAPE_CHAR;
+ for (i = 0xa1; i <= 0xfe; i++)
+ table[i] = ESCAPE_CHAR;
+}
+
+/* XXX: add state */
+static int decode_euc_jp_func(__unused__ CharsetDecodeState *s,
+ const unsigned char **pp)
+{
+ const unsigned char *p;
+ int c, c2;
+
+ p = *pp;
+ c = *p++;
+ if (c == 0x8e) {
+ c = *p;
+ if (c >= 0xa1 && c <= 0xdf) {
+ c = c - 0xa1 + 0xff61;
+ p++;
+ }
+ } else if (c >= 0xa1) {
+ c2 = *p;
+ if (c2 >= 0xa1 && c2 <= 0xfe) {
+ c2 = jis0208_decode(c & 0x7f, c2 & 0x7f);
+ if (c2) {
+ c = c2;
+ p++;
+ }
+ }
+ } else {
+ /* 8f case */
+ if (p[0] >= 0xa1 && p[0] <= 0xfe &&
+ p[1] >= 0xa1 && p[1] <= 0xfe) {
+ c2 = jis0212_decode(p[0] & 0x7f, p[1] & 0x7f);
+ if (c2) {
+ c = c2;
+ p += 2;
+ }
+ }
+ }
+ *pp = p;
+ return c;
+}
+
+static unsigned char *encode_euc_jp(__unused__ QECharset *s,
+ unsigned char *q, int c)
+{
+ if (c <= 0x7f) {
+ *q++ = c;
+ } else if (c >= 0xff61 && c <= 0xFF9F) {
+ *q++ = 0x8e;
+ *q++ = c - 0xff61 + 0xa1;
+ } else {
+ /* XXX: do it */
+ return NULL;
+ }
+ return q;
+}
+
+static QECharset charset_euc_jp = {
+ "euc-jp",
+ NULL,
+ decode_euc_jp_init,
+ decode_euc_jp_func,
+ encode_euc_jp,
+ table_alloc : 1,
+ eol_char: 10,
+};
+
+
+static void decode_sjis_init(CharsetDecodeState *s)
+{
+ unsigned short *table = s->table;
+ int i;
+
+ for (i = 0; i < 256; i++)
+ table[i] = i;
+ table['\\'] = 0x00a5;
+ table[0x80] = '\\';
+ for (i = 0x81; i <= 0x9f; i++)
+ table[i] = ESCAPE_CHAR;
+ for (i = 0xa1; i <= 0xdf; i++)
+ table[i] = i - 0xa1 + 0xff61;
+ for (i = 0xe0; i <= 0xef; i++)
+ table[i] = ESCAPE_CHAR;
+ for (i = 0xf0; i <= 0xfc; i++)
+ table[i] = ESCAPE_CHAR;
+ table[0xfd] = 0xa9;
+ table[0xfe] = 0x2122;
+ table[0xff] = 0x2026;
+}
+
+/* XXX: add state */
+static int decode_sjis_func(__unused__ CharsetDecodeState *s,
+ const unsigned char **pp)
+{
+ const unsigned char *p;
+ int c, c1, c2, adjust, row, col;
+
+ p = *pp;
+ c = *p++;
+ if (c >= 0xf0) {
+ /* user data */
+ } else {
+ c1 = *p;
+ if ((c1 >= 0x40 && c1 <= 0x7e) ||
+ (c1 >= 0x80 && c1 <= 0xfc)) {
+ row = c < 0xa0 ? 0x70 : 0xb0;
+ adjust = (c1 < 0x9f);
+ col = adjust ? (c1 >= 0x80 ? 32 : 31) : 0x7e;
+ c2 = jis0208_decode(((c - row) << 1) - adjust, c1 - col);
+ if (c2) {
+ c = c2;
+ p++;
+ }
+ }
+ }
+ *pp = p;
+ return c;
+}
+
+static unsigned char *encode_sjis(__unused__ QECharset *s,
+ unsigned char *q, int c)
+{
+ if (c <= 0x7f) {
+ *q++ = c;
+ } else {
+ /* XXX: do it */
+ return NULL;
+ }
+ return q;
+}
+
+static QECharset charset_sjis = {
+ "sjis",
+ NULL,
+ decode_sjis_init,
+ decode_sjis_func,
+ encode_sjis,
+ table_alloc : 1,
+ eol_char: 10,
+};
+
+int charset_jis_init(void)
+{
+ qe_register_charset(&charset_sjis);
+ qe_register_charset(&charset_euc_jp);
+
+ return 0;
+}
+
+qe_module_init(charset_jis_init);
Index: jistoqe.c
===================================================================
RCS file: jistoqe.c
diff -N jistoqe.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ jistoqe.c 3 Dec 2007 16:16:24 -0000 1.1
@@ -0,0 +1,205 @@
+/*
+ * Convert Unicode JIS tables to QEmacs format
+ *
+ * Copyright (c) 2002 Fabrice Bellard.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+static char *get_basename(const char *pathname)
+{
+ const char *base = pathname;
+
+ while (*pathname) {
+ if (*pathname++ == '/')
+ base = pathname;
+ }
+ return (char *)base;
+}
+
+static char *get_extension(const char *pathname)
+{
+ const char *p, *ext;
+
+ for (ext = p = pathname + strlen(pathname); p > pathname; p--) {
+ if (p[-1] == '/')
+ break;
+ if (*p == '.') {
+ ext = p;
+ break;
+ }
+ }
+ return (char *)ext;
+}
+
+static char *getline(char *buf, int buf_size, FILE *f, int strip_comments)
+{
+ for (;;) {
+ char *str;
+ int len;
+
+ str = fgets(buf, buf_size, f);
+ if (!str)
+ return NULL;
+ len = strlen(buf);
+ if (len > 0 && buf[len - 1] == '\n') {
+ buf[len - 1] = '\0';
+ }
+ if (buf[0] == 26) {
+ /* handle obsolete DOS ctrl-Z marker */
+ return NULL;
+ }
+ if (strip_comments && (buf[0] == '\0' || buf[0] == '#'))
+ continue;
+
+ return str;
+ }
+}
+
+/* handle jis208 or jis212 table */
+static void handle_jis(FILE **fp, const char *name, const char *filename)
+{
+ int c1, c2, b1, b2, b1_max, b2_max, i, j, nb, n;
+ int table[94*94];
+ int table_b2_max[94];
+ char line[1024];
+ const char *p;
+ int is_jis208;
+
+ if (!strcmp(name, "JIS0208")) {
+ is_jis208 = 1;
+ name = "jis208";
+ } else
+ if (!strcmp(name, "JIS0212")) {
+ is_jis208 = 0;
+ name = "jis212";
+ } else {
+ fprintf(stderr, "%s: unsupported JIS file\n", filename);
+ return;
+ }
+
+ memset(table, 0, sizeof(table));
+ memset(table_b2_max, 0, sizeof(table_b2_max));
+ b1_max = 0;
+ b2_max = 0;
+ nb = 0;
+ for (;;) {
+ if (!getline(line, sizeof(line), *fp, 1))
+ break;
+ p = line;
+ if (is_jis208)
+ c1 = strtol(p, (char **)&p, 0);
+ c1 = strtol(p, (char **)&p, 0);
+ c2 = strtol(p, (char **)&p, 0);
+
+ b1 = (c1 >> 8) & 0xff;
+ b2 = (c1) & 0xff;
+
+ /* compress the code */
+ b1 = b1 - 0x21;
+ b2 = b2 - 0x21;
+ if (b1 > b1_max)
+ b1_max = b1;
+ if (b2 > b2_max)
+ b2_max = b2;
+ if (b2 > table_b2_max[b1])
+ table_b2_max[b1] = b2;
+ table[b1 * 94 + b2] = c2;
+ nb++;
+ }
+ printf("/* max row = %d. The following rows are excluded:\n ", b1_max);
+ n = 0;
+ for (i = 0; i <= b1_max; i++) {
+ if (table_b2_max[i] == 0) {
+ printf(" %d", i);
+ } else {
+ n++;
+ }
+ }
+ printf(", density=%d%% */\n", nb * 100 / (n * (b2_max + 1)));
+
+ printf("static unsigned short const table_%s[%d] = {\n",
+ name, n * (b2_max + 1));
+ n = 0;
+ for (i = 0; i <= b1_max; i++) {
+ if (table_b2_max[i] != 0) {
+ for (j = 0; j <= b2_max; j++) {
+ if ((n & 7) == 0)
+ printf(" ");
+ printf("0x%04x, ", table[i * 94 + j]);
+ if ((n++ & 7) == 7)
+ printf("\n");
+ }
+ }
+ }
+ if ((n & 7) != 0)
+ printf("\n");
+ printf("};\n\n");
+}
+
+int main(int argc, char **argv)
+{
+ int i;
+ const char *filename;
+ char name[256];
+ FILE *f;
+
+ printf("/* This file was generated automatically by jistoqe */\n");
+
+ printf("\n" "/*"
+ "\n" " * JIS Tables for QEmacs"
+ "\n" " * Copyright (c) 2002 Fabrice Bellard."
+ "\n" " *"
+ "\n" " * This library is free software; you can redistribute it
and/or"
+ "\n" " * modify it under the terms of the GNU Lesser General Public"
+ "\n" " * License as published by the Free Software Foundation;
either"
+ "\n" " * version 2 of the License, or (at your option) any later
version."
+ "\n" " *"
+ "\n" " * This library is distributed in the hope that it will be
useful,"
+ "\n" " * but WITHOUT ANY WARRANTY; without even the implied
warranty of"
+ "\n" " * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
the GNU"
+ "\n" " * Lesser General Public License for more details."
+ "\n" " *"
+ "\n" " * You should have received a copy of the GNU Lesser General
Public"
+ "\n" " * License along with this library; if not, write to the Free
Software"
+ "\n" " * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA"
+ "\n" " */"
+ "\n" ""
+ "\n");
+
+ for (i = 1; i < argc; i++) {
+ filename = argv[i];
+
+ strcpy(name, get_basename(filename));
+ *get_extension(name) = '\0';
+
+ f = fopen(filename, "r");
+ if (!f) {
+ perror(filename);
+ exit(1);
+ }
+
+ handle_jis(&f, name, filename);
+
+ fclose(f);
+ }
+
+ return 0;
+}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemacs-commit] qemacs charsetjis.c jistoqe.c,
Charlie Gordon <=