qemacs-commit
[Top][All Lists]
Advanced

[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;
+}




reply via email to

[Prev in Thread] Current Thread [Next in Thread]