OSDN Git Service

* src/header.c (convert_filename): support Samba CAP code (experimental).
authorarai <arai@6a8cc165-1e22-0410-a132-eb4e3f353aba>
Sun, 23 Mar 2003 12:34:47 +0000 (12:34 +0000)
committerarai <arai@6a8cc165-1e22-0410-a132-eb4e3f353aba>
Sun, 23 Mar 2003 12:34:47 +0000 (12:34 +0000)
(hex2int, int2hex, cap_to_sjis, sjis_to_cap): added for above.

* src/lha_macro.h (CODE_CAP): ditto.

* src/lharc.c (parse_option): added new command line options,
--system-kanji-code=xxx and --archive-kanji-code=xxx (experimental).

* 00readme.autoconf (Repository): described above features.

git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/lha/lha/trunk@682 6a8cc165-1e22-0410-a132-eb4e3f353aba

00readme.autoconf
src/header.c
src/lha_macro.h
src/lharc.c

index 548a6ad..f46c90e 100644 (file)
@@ -112,11 +112,41 @@ LHa for UNIX 
 
   ¥Ç¥Õ¥©¥ë¥È¤Ï¡¢auto ¤Ç¤¹¡£
 
-  ¾­ÍèŪ¤Ë¤Ï lha ¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó¤ä´Ä¶­ÊÑ¿ô¤Ë¤è¤ê¥¢¡¼¥«¥¤¥Ö¡¢
-  ¥·¥¹¥Æ¥à¤Î³Æ´Á»ú¥³¡¼¥É¤ò»ØÄê¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¤¬¡¢º£¤Î¤È
-  ¤³¤í¼ÂÁõ¤Ï¤·¤Æ¤¤¤Þ¤»¤ó¡£
+  lha ¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢¥³¥ó¥Ñ¥¤¥ë»þ¤Î¥Ç¥Õ¥©¥ë¥È»ØÄê¤ò
+  Êѹ¹¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó¤Ï¡¢GNU style ¤Î 
+  long option (¥À¥Ã¥·¥å2¤Ä¤¬Àè¹Ô¤¹¤ë¥¹¥¿¥¤¥ë)¤Ç»ØÄꤷ¤Þ¤¹¡£
 
-  (ͽÄê: samba ¤Î CAP code ¤Ê¤É¤Ë¤âÂбþ¤·¤è¤¦¤È»×¤Ã¤Æ¤Þ¤¹)
+       --system-kanji-code=xxx
+               ¥·¥¹¥Æ¥à¤Î¥Õ¥¡¥¤¥ë̾¤Î´Á»ú¥³¡¼¥É¤ò»ØÄꤷ¤Þ¤¹¡£
+
+       --archive-kanji-code=xxx
+               ¥¢¡¼¥«¥¤¥ÖÆâ¤Ø³ÊǼ¤¹¤ë¤È¤­¤Î¥Õ¥¡¥¤¥ë̾¤Î¥³¡¼¥É¤ò»ØÄꤷ
+               ¤Þ¤¹¡£¤³¤ì¤ÏÄ̾ï SJIS ¸ÇÄê¤Ê¤Î¤ÇÊѹ¹¤¹¤ë¤Ù¤­¤Ç¤Ï¤¢¤ê¤Þ
+               ¤»¤ó¡£
+
+  xxx ¤Ï sjis, euc, utf8, cap ¤Î¤¤¤º¤ì¤«¤Ç¤¹¡£cap ¤Ï¡¢samba ¤Ê¤É¤Ç»È¤ï¤ì¤ë
+  ¥³¡¼¥É¤Ç¡¢´Á»ú¥³¡¼¥É¤ò ":" ¤È 16 ¿Êʸ»ú¤Çɽ¸½¤¹¤ë¥³¡¼¥É¤Ç¤¹¡£
+
+  Î㤨¤Ð¡¢
+
+       $ touch ´Á»ú
+       $ lha c foo.lzh ´Á»ú
+       $ lha l foo.lzh
+
+       PERMISSION  UID  GID      SIZE  RATIO     STAMP           NAME
+       ---------- ----------- ------- ------ ------------ --------------------
+       -rw-r--r--  1000/1000        0 ****** Mar 23 21:23 ´Á»ú
+       ---------- ----------- ------- ------ ------------ --------------------
+        Total         1 file        0 ****** Mar 23 21:23
+
+       $ lha l --system-kanji-code=cap foo.lzh
+
+       PERMISSION  UID  GID      SIZE  RATIO     STAMP           NAME
+       ---------- ----------- ------- ------ ------------ --------------------
+       -rw-r--r--  1000/1000        0 ****** Mar 23 21:23 :8a:bf:8e:9a
+       ---------- ----------- ------- ------ ------------ --------------------
+
+  ¤Ê¤É¤È¤Ê¤ê¤Þ¤¹¡£
 
   Mac OS X ÍѤΠutf8 <-> sjis ÊÑ´¹¤Ï¡¢2002/6 ¤Ëºä°æ¹À¿Í¤µ¤ó¤ËºîÀ®¤·¤Æ
   ¤¤¤¿¤À¤­¤Þ¤·¤¿¡£¤¢¤ê¤¬¤È¤¦¤´¤¶¤¤¤Þ¤¹¡£
index 9fa4da9..7e35be5 100644 (file)
@@ -211,8 +211,8 @@ convert_filename(name, len, size,
                  from_delim, to_delim,
                  case_to)
     char *name;
-    int len;
-    int size;
+    int len;                    /* length of name */
+    int size;                   /* size of name buffer */
     int from_code, to_code, case_to;
     char *from_delim, *to_delim;
 
@@ -220,6 +220,20 @@ convert_filename(name, len, size,
     int i;
 #ifdef MULTIBYTE_FILENAME
     char tmp[FILENAME_LENGTH];
+    int to_code_save = NONE;
+
+    if (from_code == CODE_CAP) {
+        len = cap_to_sjis(tmp, name, sizeof(tmp));
+        strncpy(name, tmp, size);
+        name[size-1] = 0;
+        len = strlen(name);
+        from_code = CODE_SJIS;
+    }
+
+    if (to_code == CODE_CAP) {
+        to_code_save = CODE_CAP;
+        to_code = CODE_SJIS;
+    }
 
     if (from_code == CODE_SJIS && to_code == CODE_UTF8) {
         for (i = 0; i < len; i++)
@@ -343,6 +357,15 @@ convert_filename(name, len, size,
             continue;
         }
     }
+
+#ifdef MULTIBYTE_FILENAME
+    if (to_code_save == CODE_CAP) {
+        len = sjis_to_cap(tmp, name, sizeof(tmp));
+        strncpy(name, tmp, size);
+        name[size-1] = 0;
+        len = strlen(name);
+    }
+#endif /* MULTIBYTE_FILENAME */
 }
 
 /*
@@ -1784,4 +1807,106 @@ sjis2euc(int *p1, int *p2)
     *p1 |= 0x80;
     *p2 |= 0x80;
 }
+
+static int
+hex2int(int c)
+{
+    switch (c) {
+    case '0': case '1': case '2': case '3': case '4':
+    case '5': case '6': case '7': case '8': case '9':
+        return c - '0';
+
+    case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+        return c - 'a' + 10;
+
+    case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+        return c - 'A' + 10;
+    default:
+        return -1;
+    }
+}
+
+static int
+int2hex(int c)
+{
+    switch (c) {
+    case 0: case 1: case 2: case 3: case 4:
+    case 5: case 6: case 7: case 8: case 9:
+        return c + '0';
+
+    case 10: case 11: case 12: case 13: case 14: case 15:
+        return c + 'a' - 10;
+
+    default:
+        return -1;
+    }
+}
+
+int
+cap_to_sjis(char *dst, const char *src, size_t dstsize)
+{
+    int i, j;
+    size_t len = strlen(src);
+    int a, b;
+
+    for (i = j = 0; i < len && i < dstsize; i++) {
+        if (src[i] != ':') {
+            dst[j++] = src[i];
+            continue;
+        }
+
+        i++;
+        a = hex2int((unsigned char)src[i]);
+        b = hex2int((unsigned char)src[i+1]);
+
+        if (a == -1 || b == -1) {
+            /* leave as it */
+            dst[j++] = ':';
+            strncpy(dst+j, src+i, dstsize-j);
+            dst[dstsize-1] = 0;
+            return strlen(dst);
+        }
+
+        i++;
+
+        dst[j++] = a * 16 + b;
+    }
+    dst[j] = 0;
+    return j;
+}
+
+int
+sjis_to_cap(char *dst, const char *src, size_t dstsize)
+{
+    int i, j;
+    size_t len = strlen(src);
+    int a, b;
+
+    for (i = j = 0; i < len && i < dstsize; i++) {
+        if (src[i] == ':') {
+            strncpy(dst+j, ":3a", dstsize-j);
+            dst[dstsize-1] = 0;
+            j = strlen(dst);
+            continue;
+        }
+        if (isprint(src[i])) {
+            dst[j++] = src[i];
+            continue;
+        }
+
+        if (j + 3 >= dstsize) {
+            dst[j] = 0;
+            return j;
+        }
+
+        a = int2hex((unsigned char)src[i] / 16);
+        b = int2hex((unsigned char)src[i] % 16);
+
+        dst[j++] = ':';
+        dst[j++] = a;
+        dst[j++] = b;
+    }
+    dst[j] = 0;
+    return j;
+}
 #endif /* MULTIBYTE_FILENAME */
index ad3b1d4..556b7a6 100644 (file)
@@ -44,6 +44,7 @@
 #define CODE_EUC 1
 #define CODE_SJIS 2
 #define CODE_UTF8 3
+#define CODE_CAP 4              /* Columbia AppleTalk Program */
 #define TO_LOWER 1
 #define TO_UPPER 2
 
index d899d95..48a15c8 100644 (file)
@@ -51,6 +51,9 @@ static int error_occurred;
 static void     sort_files();
 static void     print_version();
 
+extern int optional_archive_kanji_code;
+extern int optional_system_kanji_code;
+
 /* ------------------------------------------------------------------------ */
 static void
 init_variable()     /* Added N.Watazaki */
@@ -415,6 +418,54 @@ parse_option(int argc, char **argv)
         if (strcmp(opt, "-") == 0)
             break;
 
+        /* GNU style long options */
+        if (opt[0] == '-' && opt[1] == '-') {
+            opt += 2;
+
+            if (strncmp(opt, "system-kanji-code=",
+                        sizeof("system-kanji-code=")-1) == 0) {
+                opt += sizeof("system-kanji-code=")-1;
+                if (strcmp(opt, "euc") == 0) {
+                    optional_system_kanji_code = CODE_EUC;
+                }
+                else if (strcmp(opt, "sjis") == 0) {
+                    optional_system_kanji_code = CODE_SJIS;
+                }
+                else if (strcmp(opt, "utf8") == 0) {
+                    optional_system_kanji_code = CODE_UTF8;
+                }
+                else if (strcmp(opt, "cap") == 0) {
+                    optional_system_kanji_code = CODE_CAP;
+                }
+                else {
+                    print_tiny_usage();
+                    exit(2);
+                }
+            }
+            else if (strncmp(opt, "archive-kanji-code=",
+                             sizeof("archive-kanji-code=")-1) == 0) {
+                opt += sizeof("archive-kanji-code=")-1;
+                if (strcmp(opt, "euc") == 0) {
+                    optional_archive_kanji_code = CODE_EUC;
+                }
+                else if (strcmp(opt, "sjis") == 0) {
+                    optional_archive_kanji_code = CODE_SJIS;
+                }
+                else if (strcmp(opt, "utf8") == 0) {
+                    optional_archive_kanji_code = CODE_UTF8;
+                }
+                else if (strcmp(opt, "cap") == 0) {
+                    optional_archive_kanji_code = CODE_CAP;
+                }
+                else {
+                    print_tiny_usage();
+                    exit(2);
+                }
+            }
+            argv++; argc--;
+            goto next;
+        }
+
         argv++; argc--;
     }
 
@@ -521,10 +572,6 @@ main(argc, argv)
 
 
 /* ------------------------------------------------------------------------ */
-/* */
-/* ------------------------------------------------------------------------ */
-
-/* ------------------------------------------------------------------------ */
 static void
 print_version()
 {