¥Ç¥Õ¥©¥ë¥È¤Ï¡¢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 ¤Ëºä°æ¹À¿Í¤µ¤ó¤ËºîÀ®¤·¤Æ
¤¤¤¿¤À¤¤Þ¤·¤¿¡£¤¢¤ê¤¬¤È¤¦¤´¤¶¤¤¤Þ¤¹¡£
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;
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++)
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 */
}
/*
*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 */
#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
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 */
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--;
}
/* ------------------------------------------------------------------------ */
-/* */
-/* ------------------------------------------------------------------------ */
-
-/* ------------------------------------------------------------------------ */
static void
print_version()
{