OSDN Git Service

merged changing from lha-1.14f to lha-1.14i.
authorarai <arai@6a8cc165-1e22-0410-a132-eb4e3f353aba>
Mon, 29 Jan 2001 19:33:49 +0000 (19:33 +0000)
committerarai <arai@6a8cc165-1e22-0410-a132-eb4e3f353aba>
Mon, 29 Jan 2001 19:33:49 +0000 (19:33 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/lha/lha/trunk@24 6a8cc165-1e22-0410-a132-eb4e3f353aba

15 files changed:
change-114f.txt [deleted file]
src/extract.c
src/header.c
src/huf.c
src/lha.h
src/lha_macro.h
src/lhadd.c
src/lharc.c
src/lhext.c
src/lhlist.c
src/maketbl.c
src/maketree.c
src/shuf.c
src/slide.c
src/util.c

diff --git a/change-114f.txt b/change-114f.txt
deleted file mode 100644 (file)
index 4cb1c51..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-lha for unix ver 1.14e bugs
-
-¢£¢£¢£¢£¢£¢£¢£¢£¢£¢£ Êó¹ð ¢£¢£¢£¢£¢£¢£¢£¢£¢£¢£
-(15)
-
-¢£ÌäÂê
-ls config.* | lha a arc.lzh¤Ç°µ½Ì¤¬¤Ç¤­¤Ê¤¤¡£
-
-¢£¸¶°ø
-ɸ½àÆþÎϤ«¤éfgets¤Çʸ»úÎó¤ò¼è¤ê½Ð¤·¤Æ¤¤¤ë¤¿¤á¡¢
-ʸ»úÎó¤ÎºÇ¸å¤Ë'\n'¤¬´Þ¤Þ¤ì¤Æ¤¤¤¿¡£¤³¤Î·ë²Ì
-Èæ³Ó¤¬Àµ¾ï¤Ë¹Ô¤¨¤Ê¤«¤Ã¤¿¡£
-
-¢£Âнè
-'\n'¤ò¼è¤ê½ü¤¯¤è¤¦¤Ë¥×¥í¥°¥é¥à¥½¡¼¥¹¤òÊѹ¹¤·¤¿¡£
-1999.7.18
-
-¢£Âнè³Îǧ
-ls *.c | lha a tst.lzh ¤Ç°µ½Ì¤Þ¤¿¡¢
-ls *.c | lha l tst.lzh ¤Ç¥ê¥¹¥È¤Ç¤­¤ë¤³¤È¤ò³Îǧ
-¤·¤¿¡£
-
-
-¢£¢£¢£¢£¢£¢£¢£¢£¢£¢£ Êó¹ð ¢£¢£¢£¢£¢£¢£¢£¢£¢£¢£
-(16)
-
-¢£ÌäÂê
-Ÿ³«¤Ç¤­¤Ê¤¤windows¤Îsuffix¥Õ¥¡¥¤¥ë¤¬
-¤Þ¤À¸ºß¤¹¤ë¡£
-
-¢£¸¶°ø
-SFX¥³¡¼¥É¤¬16KB°Ê¾å¤Î¥Õ¥¡¥¤¥ë¤¬Â¿¤¯
-¸ºß¤¹¤ë¤é¤·¤¯¡¢lha for unix¤Ç¤Ï
-16KB°ÊÆ⤷¤«Âбþ¤·¤Æ¤¤¤Ê¤«¤Ã¤¿¡£
-
-¢£Âнè
-64KB¤Þ¤ÇÆɤ߹þ¤à¤è¤¦¤Ë¤·¤¿¡£
-lha_macro.h¤ÎMAXSFXCODE¤Î²Õ½ê
-
-¢£¤½¤Î¾
-64KB¤Ç¥À¥á¤Ê¤é¡¢¤â¤Ã¤ÈÂ礭¤Ê
-ÃͤòÀßÄꤷ¤Æ»î¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
-¤½¤ì¤Ç¤â¥À¥á¤À¤ÈÊ̤ÎÌäÂ꤫¤â¤·¤ì¤Þ¤»¤ó¤¬¡£¡£¡£
-
-
-¢£¢£¢£¢£¢£¢£¢£¢£¢£¢£ Êó¹ð ¢£¢£¢£¢£¢£¢£¢£¢£¢£¢£
-(17)
-
-¢£ÌäÂê
-change-114e.txt¤Î(13)ÈÖ¤ÈƱ¤¸¸¶°ø¤Ë¤è¤ëÌäÂêÅÀ¤Ç¡¢
-lchown()¥·¥¹¥Æ¥à¥³¡¼¥ë¤òchown()¤È¤ÏÊ̤˻ý¤Ã¤Æ¤¤¤ë
-¥·¥¹¥Æ¥à¤Çµ¯¤­¤ëÌäÂ꤬¤¢¤ë¤é¤·¤¤¡£
-
-¢£Âнè
-lchown¤¬¤¢¤ì¤Ðlchown¤ò»È¤¦¤³¤È¤Ë¤·¤¿¡£1999.7.19
-lchown¤¬Ìµ¤¤»þ¤ÏHAVE_NO_LCHOWN¤òÄêµÁ¤·¤Æ¤¯¤À¤µ¤¤¡£
-
-¢£¢£¢£¢£¢£¢£¢£¢£¢£¢£ Êó¹ð ¢£¢£¢£¢£¢£¢£¢£¢£¢£¢£
-(18)
-
-¢£ÌäÂê
-lha filename¤¬lha l filename¤ÎµóÆ°¤ÈƱ¤¸¤Ç¤Ï¤Ê¤¤
-
-¢£¸¶°ø
-¥Õ¥¡¥¤¥ëfilename¤ò»²¾È¤¹¤ë²Õ½ê¤Î´Ö°ã¤¤¡£
-
-¢£Âнè
-½¤Àµ¤·¤¿¡£
-1999.7.18
-
-
-¢£¢£¢£¢£¢£¢£¢£¢£¢£¢£ Êó¹ð ¢£¢£¢£¢£¢£¢£¢£¢£¢£¢£
-(19)
-
-¢£ÌäÂê
-main´Ø¿ô¤¬void¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡£
-warning¤¬¤Ç¤ë¤³¤È¤¬¤¢¤ë¡£
-¢£Âнè
-int¤Ë¤·¤Þ¤·¤¿¡£
-
-¢£¢£¢£¢£¢£¢£¢£¢£¢£¢£ Êó¹ð ¢£¢£¢£¢£¢£¢£¢£¢£¢£¢£
-(20)
-
-¢£ÌäÂê
-tab¤¬¥µ¥¤¥º4¤Ç¡¢Æɤߤˤ¯¤¤´Ä¶­¤¬¤¢¤ë²ÄǽÀ­¤¬¤¢¤ë¡£
-
-¢£Âнè
-̤Âнè
-
-¢£¢£¢£¢£¢£¢£¢£¢£¢£¢£ Êó¹ð ¢£¢£¢£¢£¢£¢£¢£¢£¢£¢£
-(21)
-
-¢£ÌäÂê
-¤¢¤ë¼ï¤Î¥Õ¥¡¥¤¥ë¤¬CRC¥¨¥é¡¼¤Ë¤Ê¤ë¡£
-
-¢£¸¶°ø
-°µ½Ì¼­½ñ¤Î½é´ü²½¤ÎÈϰϤËÉÔÅԹ礬¤¢¤Ã¤¿¡£
-
-¢£Âнè
-½é´ü»þ¤Î¼­½ñ¤òŬÀڤˤ·¤¿¡£
-1999.7.19
-
-¢£Âнè³Îǧ
-ÉÔÅԹ礬µ¯¤­¤ë¥µ¥ó¥×¥ë¤òÆþ¼ê¤·¡¢
-ÉÔÅԹ礬ȯÀ¸¤·¤Ê¤¤¤³¤È¤ò³Îǧ¤·¤¿¡£
-
-¢£¢£¢£¢£¢£¢£¢£¢£¢£¢£ Êó¹ð ¢£¢£¢£¢£¢£¢£¢£¢£¢£¢£
-(22)
-
-¢£ÌäÂê
-util.c¤Çiskanji()¤ò»È¤Ã¤Æ¤¤¤ëÉôʬ¤¬Â¸ºß¤·¤¿¡£
-
-¢£Âнè
-iskanji()¤ÎÂå¤ï¤ê¤ËMULTIBYTE_FIRST_P¤ò
-»È¤¦»ö¤Ë¤·¤¿¡£1999.7.19
-
index f760d96..2409353 100644 (file)
@@ -47,8 +47,12 @@ decode_lzhuf(infp, outfp, original_size, packed_size, name, method)
                                ,1 << interface.dicbit);
                decode(&interface);
                break;
-       case LZHUFF6_METHOD_NUM:                /* -lz6- */     /* Added N.Watazaki (^_^) */
-               interface.dicbit = 15;          
+       case LZHUFF6_METHOD_NUM:                /* -lh6- */     /* Added N.Watazaki (^_^) */
+#ifdef SUPPORT_LH7
+       case LZHUFF7_METHOD_NUM:                /* -lh7- */
+#endif
+           interface.dicbit = (method - LZHUFF6_METHOD_NUM) + 15;
+               
        default:
                start_indicator(name, original_size
                                ,verify_mode ? "Testing " : "Melting "
@@ -59,6 +63,8 @@ decode_lzhuf(infp, outfp, original_size, packed_size, name, method)
 
        return crc;
 }
+
 /* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
 /* End: */
index e4e12e9..4ea441e 100644 (file)
@@ -9,13 +9,10 @@
 /*     Ver. 1.10  Symbolic Link added                          1993.10.01      N.Watazaki              */
 /*     Ver. 1.13b Symbolic Link Bug Fix                        1994.08.22      N.Watazaki              */
 /*     Ver. 1.14  Source All chagned                           1995.01.14      N.Watazaki              */
-/*  Ver. 1.14e bug fixed                                               1999.05.27  T.Okamoto       */
+/*  Ver. 1.14i bug fixed                                               2000.10.06  t.okamoto       */
 /* ------------------------------------------------------------------------ */
 #include "lha.h"
 
-void euc2sjis(int *p1, int *p2);
-void sjis2euc(int *p1, int *p2);
-
 /* ------------------------------------------------------------------------ */
 static char    *get_ptr;
 
@@ -93,47 +90,20 @@ msdos_to_unix_filename(name, len)
        register int    i;
 
 #ifdef MULTIBYTE_CHAR
-#ifdef SUPPORT_X0201
-       for (i = 0; i < len; i++) {
-               /* modified by Koji Arai */
-               if (X0201_KANA_P(name[i])) {
-                       int j;
-                       for (j = len; j >= i; j--) {
-                               name[j+1] = name[j]; /* no check over */
-                       }
-                       name[i] = 0x8e;
-                       i++;
-                       len++;
-               } else
-               if (MULTIBYTE_FIRST_P(name[i]) &&
-                   MULTIBYTE_SECOND_P(name[i + 1])) {
-                       int c1, c2;
-                       c1 = name[i]; c2 = name[i+1];
-                       sjis2euc(&c1, &c2);
-                       name[i] = c1; name[i+1] = c2;
-                       i++;
-               }
-               else if (name[i] == '\\')
-                       name[i] = '/';
-               else if (isupper(name[i]))
-                       name[i] = tolower(name[i]);
-       }
-#else
        for (i = 0; i < len; i++) {
                if (MULTIBYTE_FIRST_P(name[i]) &&
                    MULTIBYTE_SECOND_P(name[i + 1]))
                        i++;
                else if (name[i] == '\\')
                        name[i] = '/';
-               else if (isupper(name[i]))
+               else if (!noconvertcase && isupper(name[i]))
                        name[i] = tolower(name[i]);
        }
-#endif /* SUPPORT_X0201 */
 #else
        for (i = 0; i < len; i++) {
                if (name[i] == '\\')
                        name[i] = '/';
-               else if (isupper(name[i]))
+               else if (!noconvertcase && isupper(name[i]))
                        name[i] = tolower(name[i]);
        }
 #endif
@@ -149,19 +119,7 @@ generic_to_unix_filename(name, len)
        boolean         lower_case_used = FALSE;
 
 #ifdef MULTIBYTE_CHAR
-#ifdef SUPPORT_X0201
        for (i = 0; i < len; i++) {
-               /* modified by Koji Arai */
-               if (X0201_KANA_P(name[i])) {
-                       int j;
-                       for (j = len; j >= i; j--) {
-                               name[j+1] = name[j]; /* no check over */
-                       }
-                       name[i] = 0x8e;
-                       i++;
-                       len++;
-               } else
-
                if (MULTIBYTE_FIRST_P(name[i]) &&
                    MULTIBYTE_SECOND_P(name[i + 1]))
                        i++;
@@ -170,24 +128,13 @@ generic_to_unix_filename(name, len)
                        break;
                }
        }
-#else
-       for (i = 0; i < len; i++) {
-               if (MULTIBYTE_FIRST_P(name[i]) &&
-                   MULTIBYTE_SECOND_P(name[i + 1]))
-                       i++;
-               else if (islower(name[i])) {
-                       lower_case_used = TRUE;
-                       break;
-               }
-       }
-#endif /* SUPPORT_X0201 */
        for (i = 0; i < len; i++) {
                if (MULTIBYTE_FIRST_P(name[i]) &&
                    MULTIBYTE_SECOND_P(name[i + 1]))
                        i++;
                else if (name[i] == '\\')
                        name[i] = '/';
-               else if (!lower_case_used && isupper(name[i]))
+               else if (!noconvertcase && !lower_case_used && isupper(name[i]))
                        name[i] = tolower(name[i]);
        }
 #else
@@ -199,7 +146,7 @@ generic_to_unix_filename(name, len)
        for (i = 0; i < len; i++) {
                if (name[i] == '\\')
                        name[i] = '/';
-               else if (!lower_case_used && isupper(name[i]))
+               else if (!noconvertcase && !lower_case_used && isupper(name[i]))
                        name[i] = tolower(name[i]);
        }
 #endif
@@ -213,45 +160,12 @@ macos_to_unix_filename(name, len)
 {
        register int    i;
 
-/* modified by Koji Arai */
-#ifdef SUPPORT_X0201
-       for (i = 0; i < len; i ++) {
-               /* modified by Koji Arai */
-               if (X0201_KANA_P(name[i])) {
-                       int j;
-                       for (j = len; j >= i; j--) {
-                               name[j+1] = name[j]; /* no check over */
-                       }
-                       name[i] = 0x8e;
-                       i++;
-                       len++;
-               } else
-
-               if (MULTIBYTE_FIRST_P (name[i]) &&
-                       MULTIBYTE_SECOND_P (name[i+1])) {
-                       int c1, c2;
-                       c1 = name[i]; c2 = name[i+1];
-                       sjis2euc(&c1, &c2);
-                       name[i] = c1; name[i+1] = c2;
-                       i ++;
-               }
-               else if (name[i] == ':')
-                       name[i] = '/';
-               else if (name[i] == '/')
-                       name[i] = ':';
-/*
-               else if (isupper (name[i]))
-                       name[i] = tolower (name[i]);
-*/
-       }
-#else
        for (i = 0; i < len; i++) {
                if (name[i] == ':')
                        name[i] = '/';
                else if (name[i] == '/')
                        name[i] = ':';
        }
-#endif /* SUPPORT_X0201 */
 }
 
 /* ------------------------------------------------------------------------ */
@@ -454,10 +368,10 @@ gettz()
 #if !defined(HAVE_TZSET) && !defined(HAVE_FTIME)       /* maybe defined(HAVE_GETTIMEOFDAY) */
 {
 #ifdef HAVE_TM_GMTOFF
-        time_t tt;
+       time_t tt;
 
-        time(&tt);
-        return -localtime(&tt)->tm_gmtoff;
+       time(&tt);
+       return -localtime(&tt)->tm_gmtoff;
 #else /* HAVE_TM_GMTOFF */
        struct timeval  tp;
        struct timezone tzp;
@@ -633,7 +547,11 @@ get_header(fp, hdr)
        setup_get(data + I_HEADER_CHECKSUM);
        checksum = get_byte();
 
-       hdr->header_size = header_size;
+       if (hdr->header_level == 2) {
+               hdr->header_size = header_size + checksum*256;
+       } else {
+               hdr->header_size = header_size;
+       }
        bcopy(data + I_METHOD, hdr->method, METHOD_TYPE_STRAGE);
        setup_get(data + I_PACKED_SIZE);
        hdr->packed_size = get_longword();
@@ -659,7 +577,6 @@ get_header(fp, hdr)
        hdr->unix_gid = 0;
        hdr->unix_uid = 0;
 
-
        if (hdr->header_level == 0) {
                extend_size = header_size - name_length -22;
                if (extend_size < 0) {
@@ -804,11 +721,6 @@ get_header(fp, hdr)
                        hdr->header_size += get_ptr - ptr - 2;
                }
        }
-       if (dir_length) {
-               strcat(dirname, hdr->name);
-               strcpy(hdr->name, dirname);
-               name_length += dir_length;
-       }
 
        switch (hdr->extend_type) {
        case EXTEND_MSDOS:
@@ -816,7 +728,7 @@ get_header(fp, hdr)
         system_kanji_code = default_system_kanji_code;
         archive_delim = "\\";
         system_delim = "//";
-        filename_case = TO_LOWER;
+        filename_case = noconvertcase ? NONE : TO_LOWER;
 
         /* fall through */
        case EXTEND_HUMAN:
@@ -833,6 +745,7 @@ get_header(fp, hdr)
 #endif
        case EXTEND_UNIX:
         archive_kanji_code = CODE_EUC;
+        /* Cygwin, HP-UX and other UNIX are able to use SJIS as native code. */
         system_kanji_code = default_system_kanji_code;
         archive_delim = "";
         system_delim = "";
@@ -856,7 +769,10 @@ get_header(fp, hdr)
         system_kanji_code = NONE;
         archive_delim = "\\";
         system_delim = "/";
-        filename_case = TO_LOWER;
+        filename_case = noconvertcase ? NONE : TO_LOWER;
+        /* pending: if small letter is included in filename,
+           the generic_to_unix_filename() do not case conversion,
+           but this code does not consider it. */
 
                if (hdr->header_level == 2)
                        hdr->unix_last_modified_stamp = hdr->last_modified_stamp;
@@ -865,7 +781,7 @@ get_header(fp, hdr)
                                generic_to_unix_stamp(hdr->last_modified_stamp);
        }
 
-    /* filename code and delimiter conversion */
+    /* filename kanji code and delimiter conversion */
     if (specific_archive_kanji_code)
         archive_kanji_code = specific_archive_kanji_code;
     if (specific_system_kanji_code)
@@ -882,9 +798,18 @@ get_header(fp, hdr)
                   system_kanji_code,
                   archive_delim, system_delim, filename_case);
 
-#if 0
-       printf("header level=%d\n", hdr->header_level); fflush(stdout);
-#endif
+    if (dir_length && hdr->extend_type != EXTEND_MACOS) {
+        filename_conv(dirname, dir_length, sizeof(dirname),
+                      archive_kanji_code,
+                      system_kanji_code,
+                      archive_delim, system_delim, filename_case);
+    }
+
+       if (dir_length) {
+               strcat(dirname, hdr->name);
+               strcpy(hdr->name, dirname);
+               name_length += dir_length;
+       }
 
        return TRUE;
 }
@@ -1144,5 +1069,7 @@ sjis2euc(int *p1, int *p2)
 }
 
 /* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
+/* compile-command:"gcc -c header.c" */
 /* End: */
index 9393622..8004083 100644 (file)
--- a/src/huf.c
+++ b/src/huf.c
@@ -5,6 +5,7 @@
 /*             Modified                        Nobutaka Watazaki                                                       */
 /*                                                                                                                                                     */
 /*     Ver. 1.14       Source All chagned                              1995.01.14      N.Watazaki              */
+/*     Ver. 1.14i      Support LH7 & Bug Fixed                 2000.10. 6      t.okamoto               */
 /* ------------------------------------------------------------------------ */
 #include "lha.h"
 
@@ -25,7 +26,7 @@ unsigned short  c_freq[2 * NC - 1], c_table[4096], c_code[NC], p_freq[2 * NP - 1
                 pt_table[256], pt_code[NPT], t_freq[2 * NT - 1];
 
 static unsigned char *buf;
-static unsigned short bufsiz;
+static unsigned int bufsiz;
 static unsigned short blocksize;
 static unsigned short output_pos, output_mask;
 static                         int       pbit;
@@ -272,6 +273,7 @@ encode_start_st1( /* void */ )
 {
        int             i;
 
+#if 0
        if (dicbit <= (MAX_DICBIT - 2)) {
                pbit = 4;       /* lh4,5 etc. */
                np = 14;
@@ -279,6 +281,18 @@ encode_start_st1( /* void */ )
                pbit = 5;       /* lh6 */
                np = 16;
        }
+#endif
+
+       if (dicbit <= 13) {
+               pbit = 4;       /* lh4,5 etc. */
+               np = 14;
+       } else {
+               pbit = 5;       /* lh6,7 */
+               if (dicbit == 16)
+                       np = 17;
+               else
+                       np = 16;
+       }
 
        for (i = 0; i < NC; i++)
                c_freq[i] = 0;
@@ -308,7 +322,7 @@ read_pt_len(nn, nbit, i_special)
        short           nbit;
        short           i_special;
 {
-       short           i, c, n;
+       int           i, c, n;
 
        n = getbits(nbit);
        if (n == 0) {
@@ -451,17 +465,32 @@ decode_p_st1( /* void */ )
 void
 decode_start_st1( /* void */ )
 {
-       if (dicbit <= (MAX_DICBIT - 2))  {              /* 13 ... Changed N.Watazaki */
+       if (dicbit <= 13)  {
+               np = 14;
+               pbit = 4;
+       } else {
+               if (dicbit == 16) {
+                       np = 17; /* for -lh7- */
+               } else {
+                       np = 16;
+               }
+               pbit = 5;
+       }
+
+#if 0
+       if (dicbit <= 13)  {            /* 13 ... Changed N.Watazaki */
                np = 14;
                pbit = 4;
        } else {
                np = 16;
                pbit = 5;
        }
+#endif
        init_getbits();
        blocksize = 0;
 }
+
 /* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
 /* End: */
-/* vi:set ts=4 */
index d1935ff..904a2af 100644 (file)
--- a/src/lha.h
+++ b/src/lha.h
@@ -4,6 +4,7 @@
 /*             Modified                        Nobutaka Watazaki                                                       */
 /*                                                                                                                                                     */
 /*     Ver. 1.14       Soruce All chagned                              1995.01.14      N.Watazaki              */
+/*     Ver. 1.14i      Modified and bug fixed                  2000.10.06      t.okamoto       */
 /* ------------------------------------------------------------------------ */
 /*
        Included...
@@ -154,6 +155,8 @@ EXTERN struct       interfacing interface;
 EXTERN node            *next;
 /* EXTERN unsigned short crc; */  /* 1996.8.13 t.okamoto */
 
+EXTERN int      noconvertcase; /* 2000.10.6 */
+
 /* slide.c */
 EXTERN int      unpackable;
 EXTERN unsigned long origsize, compsize;
@@ -321,5 +324,8 @@ void euc2sjis(int *p1, int *p2);
 void sjis2euc(int *p1, int *p2);
 
 /* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
 /* End: */
+
+
index cec73de..e3edf13 100644 (file)
@@ -4,8 +4,11 @@
 /*             Modified                        Nobutaka Watazaki                                                       */
 /*                                                                                                                                                     */
 /*     Ver. 1.14       Soruce All chagned                              1995.01.14      N.Watazaki              */
+/*     Ver. 1.14g      modified                                                2000.05.06      T.OKAMOTO               */
 /* ------------------------------------------------------------------------ */
 
+#define LHA_VERSION "lha for unix version 1.14g"
+
 /* Most of System V, define TM_IN_SYS_TIME */
 #if    TM_IN_SYS_TIME
 #include <sys/time.h>
@@ -102,6 +105,7 @@ typedef int                         boolean;
   (((unsigned char)(c) >= 0x40) &&     \
    ((unsigned char)(c) < 0xfd) &&      \
    ((unsigned char)(c) != 0x7f))
+
 #define X0201_KANA_P(c)\
        (0xa0 < (unsigned char)(c) && (unsigned char)(c) < 0xe0)
 
@@ -138,6 +142,7 @@ typedef int                         boolean;
 #define LZHUFF4_METHOD                 "-lh4-"
 #define LZHUFF5_METHOD                 "-lh5-"
 #define LZHUFF6_METHOD                 "-lh6-"
+#define LZHUFF7_METHOD                 "-lh7-"
 #define LARC_METHOD                            "-lzs-"
 #define LARC5_METHOD                   "-lz5-"
 #define LARC4_METHOD                   "-lz4-"
@@ -153,10 +158,11 @@ typedef int                               boolean;
 #define LZHUFF4_METHOD_NUM             4
 #define LZHUFF5_METHOD_NUM             5
 #define LZHUFF6_METHOD_NUM             6
-#define LARC_METHOD_NUM                        7
-#define LARC5_METHOD_NUM               8
-#define LARC4_METHOD_NUM               9
-#define LZHDIRS_METHOD_NUM             10
+#define LZHUFF7_METHOD_NUM             7
+#define LARC_METHOD_NUM                        8
+#define LARC5_METHOD_NUM               9
+#define LARC4_METHOD_NUM               10
+#define LZHDIRS_METHOD_NUM             11
 /* Added N.Watazaki ..^ */
 
 #define I_HEADER_SIZE                  0
@@ -403,7 +409,14 @@ char *strchr (), *strrchr ();
 */
 
 /* slide.c */
+#ifdef SUPPORT_LH7
+#define MAX_DICBIT                     16      /* lh7 use 16bits */
+#endif
+
+#ifndef SUPPORT_LH7
 #define MAX_DICBIT                     15      /* lh6 use 15bits */
+#endif
+
 #define MAX_DICSIZ                     (1 << MAX_DICBIT)
 #define MATCHBIT                       8       /* bits for MAXMATCH - THRESHOLD */
 #define MAXMATCH                       256     /* formerly F (not more than UCHAR_MAX + 1) */
@@ -414,6 +427,8 @@ char *strchr (), *strrchr ();
 /* alphabet = {0, 1, 2, ..., NC - 1} */
 #define CBIT                           9       /* $\lfloor \log_2 NC \rfloor + 1$ */
 #define USHRT_BIT                      16      /* (CHAR_BIT * sizeof(ushort)) */
+
 /* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
 /* End: */
index 4c2294f..1749936 100644 (file)
@@ -613,14 +613,13 @@ char *str2;
        char *p, *q;
 
        p = str1; q = str2;
-       
        while (*p != 0 && *q != 0) {
                if (*p == '|') {
                        if (*q == 0) return 0;
-                       else return -1;
+                       else if (*q != '|') return -1;
                } else if (*q == '|') {
                        if (*p == 0) return 0;
-                       else return 1;
+                       else if (*q != '|') return 1;
                } else if (*p != *q) break;
                p++; q++;
        }
@@ -629,5 +628,7 @@ char *str2;
 
                
 /* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
+/* compile-command:"gcc -c lhadd.c" */
 /* End: */
index 9e5737b..b9fd28b 100644 (file)
@@ -37,7 +37,8 @@
 /*     Ver. 1.14  Source All chagned                           1995.01.14      N.Watazaki              */
 /*     Ver. 1.14b,c  Bug Fixed                     1996.03.07  t.okamoto               */
 /*  Ver. 1.14d Version up                       1997.01.12  t.okamoto       */
-/*  Ver. 1.14f Bug Fixed                        1999.07.19  t.okamoto       */
+/*  Ver. 1.14g Bug Fixed                        2000.05.06  t.okamoto       */
+/*  Ver. 1.14i Modified                         2000.10.06  t.okamoto       */
 /* ------------------------------------------------------------------------ */
 #define LHA_MAIN_SRC
 
@@ -61,6 +62,7 @@ char            backup_archive_name[FILENAME_LENGTH];
 
 /* static functions */
 static void     sort_files();
+static void            print_version();
 
 char               *extract_directory = NULL;
 char             **xfilev;
@@ -85,12 +87,13 @@ init_variable()             /* Added N.Watazaki */
        noexec                  = FALSE;        /* debugging option */
        force                   = FALSE;
        prof                    = FALSE;
-#ifndef SUPPORT_LH6
+#ifndef SUPPORT_LH7
        compress_method = LZHUFF5_METHOD_NUM;
 #endif
-#ifdef SUPPORT_LH6
-       compress_method = LZHUFF6_METHOD_NUM;
+#ifdef SUPPORT_LH7
+       compress_method = LZHUFF7_METHOD_NUM;
 #endif
+
        header_level    = HEADER_LEVEL1;
        quiet_mode              = 0;
 
@@ -117,6 +120,8 @@ init_variable()             /* Added N.Watazaki */
        ignore_directory                                                = FALSE;
        verify_mode                                                             = FALSE;
 
+       noconvertcase                                                   = FALSE;
+
        extract_directory = NULL;
        xfilec = 257;
 }
@@ -138,7 +143,7 @@ LHx      for MSDOS V C2.01 Copyright(C) 1990  H.Yoshizaki\n\
 LHx(arc) for OSK   V 2.01  Modified     1990  Momozou\n\
 LHa      for UNIX  V 1.00  Copyright(C) 1992  Masaru Oki\n\
 LHa      for UNIX  V 1.14  Modified     1995  Nobutaka Watazaki\n\
-LHa      for UNIX  V 1.14f Modified     1999  Tsugio Okamoto\n\
+LHa      for UNIX  V 1.14i Modified     2000  Tsugio Okamoto\n\
 ");
        fprintf(stderr, "\
 usage: lha [-]{axelvudmcp[q[num]][vnfodizg012]}[w=<dir>] archive_file [file...]\n\
@@ -147,13 +152,24 @@ commands:                           options:\n\
  x,e EXtract from archive            v  verbose\n\
  l,v List / Verbose List             n  not execute\n\
  u   Update newer files to archive   f  force (over write at extract)\n\
- d   Delete from archive             t  FILES are TEXT file\n\
- m   Move to archive (means 'ad')    o[56] compression method (a/u)\n\
+ d   Delete from archive             t  FILES are TEXT file\n");
+#ifdef SUPPORT_LH7
+       fprintf(stderr, "\
+ m   Move to archive (means 'ad')    o[567] compression method (a/u)\n\
+");
+#endif
+#ifndef SUPPORT_LH7
+       fprintf(stderr, "\
+ m   Move to archive (means 'ad')    o  use LHarc compatible method (a/u)\n\
+");
+#endif
+       fprintf(stderr, "\
  c   re-Construct new archive        w=<dir> specify extract directory (a/u/m/x/e)\n\
  p   Print to STDOUT from archive    d  delete FILES after (a/u/c)\n\
  t   Test file CRC in archive        i  ignore directory path (x/e)\n\
                                      z  files not compress (a/u)\n\
-                                     g  [Generic] format (for compatibility)\n\
+                                     g  Generic format (for compatibility)\n\
+                                        or not convert case when extracting\n\
                                      0/1/2 header level (a/u)\n\
 ");
 #ifdef EUC
@@ -188,6 +204,12 @@ main(argc, argv)
 
        if (ac < 2)
                print_tiny_usage_and_exit();
+
+       if (strcmp(av[1], "--version") == 0) {
+               print_version();
+               exit(1);
+       }
+
        if (ac < 3) {
                cmd = CMD_LIST;
                av--; /* argv--; */ /* 1999.7.18 */
@@ -293,6 +315,7 @@ main(argc, argv)
                        break;
                case 'g':
                        generic_format = TRUE;
+                       noconvertcase = TRUE;
                        header_level = 0;
                        break;
                case 'd':
@@ -301,22 +324,28 @@ main(argc, argv)
                case 'o':
                        switch (*p) {
                        case 0:
-                compress_method = LZHUFF1_METHOD_NUM;
-                header_level = 0;
-                break;
+                               compress_method = LZHUFF1_METHOD_NUM;
+                               header_level = 0;
+                               break;
                        case '5':
-                compress_method = LZHUFF5_METHOD_NUM;
-                p++;
-                break;
+                               compress_method = LZHUFF5_METHOD_NUM;
+                               p++;
+                               break;
+#ifdef SUPPORT_LH7
                        case '6':
-                compress_method = LZHUFF6_METHOD_NUM;
-                p++;
-                break;
+                               compress_method = LZHUFF6_METHOD_NUM;
+                               p++;
+                               break;
+                       case '7':
+                               compress_method = LZHUFF7_METHOD_NUM;
+                               p++;
+                               break;
+#endif
                        default:
-                fprintf(stderr, "LHa: error option o%c\n", p[-1]);
-                exit(1);
+                               fprintf(stderr, "LHa: error option o%c\n", p[-1]);
+                               exit(1);
                        }
-               break;
+                       break;
                case 'z':
                        compress_method = LZHUFF0_METHOD_NUM;   /* Changed N.Watazaki */
                        break;
@@ -366,7 +395,7 @@ work:
                        fatal_error("Virtual memory exhausted\n");
                while (fgets(inpbuf, sizeof(inpbuf), stdin)) {
                    /* delete \n if it exist */
-            i=0; p=inpbuf;
+                       i=0; p=inpbuf;
                        while (i < sizeof(inpbuf) && p != 0) {
                            if (*p == '\n') {
                                    *p = 0;
@@ -422,6 +451,18 @@ work:
        return 0;
 }
 
+
+/* ------------------------------------------------------------------------ */
+/* */
+/* ------------------------------------------------------------------------ */
+
+/* ------------------------------------------------------------------------ */
+static void
+print_version()
+{
+       fprintf(stderr, "%s\n", LHA_VERSION);
+}
+
 /* ------------------------------------------------------------------------ */
 static void
 message_1(title, subject, name)
@@ -864,7 +905,11 @@ build_temporary_name()
        else {
                sprintf(temporary_name, "%s/lhXXXXXX", extract_directory);
        }
+#ifdef MKSTEMP
+       mkstemp(temporary_name);
+#else
        mktemp(temporary_name);
+#endif
 #else
        char           *p, *s;
 
@@ -873,8 +918,12 @@ build_temporary_name()
                if (*p == '/')
                        s = p;
        strcpy((s ? s + 1 : temporary_name), "lhXXXXXX");
+#ifdef MKSTEMP
+       mkstemp(temporary_name);
+#else
        mktemp(temporary_name);
 #endif
+#endif
 }
 
 /* ------------------------------------------------------------------------ */
@@ -1069,10 +1118,18 @@ copy_old_one(oafp, nafp, hdr)
        else {
                reading_filename = archive_name;
                writting_filename = temporary_name;
-               copyfile(oafp, nafp, (long) (hdr->header_size + 2) + hdr->packed_size, 0);
+               if (hdr->header_level != 2) {
+                       copyfile(oafp, nafp,
+                                        (long) (hdr->header_size + 2) + hdr->packed_size, 0);
+               } else {
+                       copyfile(oafp, nafp,
+                                        (long) (hdr->header_size) + hdr->packed_size, 0);
+               }
        }
 }
 
 /* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
+/* compile-command:"gcc -c lharc.c" */
 /* End: */
index 358eebd..c347f48 100644 (file)
@@ -19,7 +19,7 @@ static int      skip_flg = FALSE;     /* FALSE..No Skip , TRUE..Skip */
 static char       *methods[] =
 {
        LZHUFF0_METHOD, LZHUFF1_METHOD, LZHUFF2_METHOD, LZHUFF3_METHOD,
-       LZHUFF4_METHOD, LZHUFF5_METHOD, LZHUFF6_METHOD,
+       LZHUFF4_METHOD, LZHUFF5_METHOD, LZHUFF6_METHOD, LZHUFF7_METHOD,
        LARC_METHOD, LARC5_METHOD, LARC4_METHOD,
        LZHDIRS_METHOD,
        NULL
@@ -164,8 +164,8 @@ adjust_info(name, hdr)
 #if HAVE_LCHOWN
                        if ((hdr->unix_mode & UNIX_FILE_TYPEMASK) == UNIX_FILE_SYMLINK)
                                lchown(name, hdr->unix_uid, hdr->unix_gid);
-                       else 
-#endif
+                       else
+#endif /* HAVE_LCHWON */
                                chown(name, hdr->unix_uid, hdr->unix_gid);
                }
                errno = 0;
@@ -402,8 +402,7 @@ cmd_extract()
                        pos = ftell(afp);
                        extract_one(afp, &hdr);
                        fseek(afp, pos + hdr.packed_size, SEEK_SET);
-               }
-               else {
+               } else {
                        if (afp != stdin)
                                fseek(afp, hdr.packed_size, SEEK_CUR);
                        else {
@@ -419,6 +418,8 @@ cmd_extract()
 
        return;
 }
+
 /* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
 /* End: */
index 70028ef..85cd4de 100644 (file)
@@ -104,7 +104,7 @@ list_header()
        char           *p, *q;
 
        if (verbose_listing) {
-               p = "PACKED    SIZE  RATIO     CRC  ";
+               p = "PACKED    SIZE  RATIO METHOD CRC";
                q = "          NAME";
        }
        else {
@@ -257,7 +257,7 @@ list_one(hdr)
                }
 
        if (verbose)
-               printf("(%d)", hdr->header_level);
+               printf(" [%d]", hdr->header_level);
        printf("\n");
 
 }
@@ -302,8 +302,10 @@ cmd_list()
        list_files = 0;
 
        /* open archive file */
-       if ((afp = open_old_archive()) == NULL)
-               fatal_error(archive_name);
+       if ((afp = open_old_archive()) == NULL) {
+               error(archive_name, "");
+               exit(1);
+       }
        if (archive_is_msdos_sfx1(archive_name))
                skip_msdos_sfx1_code(afp);
 
@@ -338,6 +340,9 @@ cmd_list()
 
        return;
 }
+
 /* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
+/* compile-command:"gcc -c lhlist.c" */
 /* End: */
index b59dad5..4cd7c59 100644 (file)
@@ -19,8 +19,8 @@ make_table(nchar, bitlen, tablebits, table)
        unsigned short  weight[17];     /* 0x10000ul >> bitlen */
        unsigned short  start[17];      /* first code of bitlen */
        unsigned short  total;
-       unsigned int    i;
-       int             j, k, l, m, n, avail;
+       unsigned int    i, l;
+       int             j, k, m, n, avail;
        unsigned short *p;
 
        avail = nchar;
@@ -42,7 +42,7 @@ make_table(nchar, bitlen, tablebits, table)
                total += weight[i] * count[i];
        }
        if ((total & 0xffff) != 0)
-               error("Bad table (5)\n");
+               error("make_table()", "Bad table (5)\n");
 
        /* shift data for make table. */
        m = 16 - tablebits;
@@ -93,5 +93,6 @@ make_table(nchar, bitlen, tablebits, table)
 }
 
 /* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
 /* End: */
index 6c2aa6e..5330154 100644 (file)
@@ -170,5 +170,6 @@ make_tree(nparm, freqparm, lenparm, codeparm)
 }
 
 /* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
 /* End: */
index 667edf8..6696732 100644 (file)
@@ -27,7 +27,13 @@ decode_start_st0( /*void*/ )
        n_max = 286;
        maxmatch = MAXMATCH;
        init_getbits();
+#ifdef SUPPORT_LH7
+       np = 1 << (MAX_DICBIT - 7);
+#endif
+#ifndef SUPPORT_LH7
        np = 1 << (MAX_DICBIT - 6);
+#endif
+
 }
 
 /* ------------------------------------------------------------------------ */
@@ -113,7 +119,11 @@ read_tree_p(/*void*/)
        while (i < NP) {
                pt_len[i] = getbits(LENFIELD);
                if (++i == 3 && pt_len[0] == 1 && pt_len[1] == 1 && pt_len[2] == 1) {
+#ifdef SUPPORT_LH7
+                       c = getbits(MAX_DICBIT - 7);
+#else
                        c = getbits(MAX_DICBIT - 6);
+#endif
                        for (i = 0; i < NP; i++)
                                c_len[i] = 0;
                        for (i = 0; i < 256; i++)
@@ -199,6 +209,8 @@ decode_p_st0(/*void*/)
        }
        return (j << 6) + getbits(6);
 }
+
 /* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
 /* End: */
index 56807c5..9816f16 100644 (file)
@@ -38,7 +38,7 @@ static struct encode_option encode_define[2] = {
        {(void (*) ()) output_dyn,
                (void (*) ()) encode_start_fix,
        (void (*) ()) encode_end_dyn},
-       /* lh4, 5 */
+       /* lh4, 5,6 */
        {(void (*) ()) output_st1,
                (void (*) ()) encode_start_st1,
        (void (*) ()) encode_end_st1}
@@ -47,7 +47,7 @@ static struct encode_option encode_define[2] = {
        {(int (*) ()) output_dyn,
                (int (*) ()) encode_start_fix,
        (int (*) ()) encode_end_dyn},
-       /* lh4, 5 */
+       /* lh4, 5,6 */
        {(int (*) ()) output_st1,
                (int (*) ()) encode_start_st1,
        (int (*) ()) encode_end_st1}
@@ -67,6 +67,8 @@ static struct decode_option decode_define[] = {
        {decode_c_st1, decode_p_st1, decode_start_st1},
        /* lh6 */
        {decode_c_st1, decode_p_st1, decode_start_st1},
+       /* lh7 */
+       {decode_c_st1, decode_p_st1, decode_start_st1},
        /* lzs */
        {decode_c_lzs, decode_p_lzs, decode_start_lzs},
        /* lz5 */
@@ -85,7 +87,10 @@ static unsigned short max_hash_val;
 static unsigned short hash1, hash2;
 #endif
 
-#if 1
+#ifdef SUPPORT_LH7
+#define DICSIZ (1L << 16)
+#define TXTSIZ (DICSIZ * 2L + MAXMATCH)
+#else
 #define DICSIZ (((unsigned long)1) << 15)
 #define TXTSIZ (DICSIZ * 2 + MAXMATCH)
 #endif
@@ -117,10 +122,12 @@ encode_alloc(method)
        } else { /* method LH4(12),LH5(13),LH6(15) */
                encode_set = encode_define[1];
                maxmatch = MAXMATCH;
-               if (method == LZHUFF6_METHOD_NUM)
-                       dicbit = MAX_DICBIT;            /* 15 bits */
+               if (method == LZHUFF7_METHOD_NUM)
+                       dicbit = MAX_DICBIT; /* 16 bits */
+               else if (method == LZHUFF6_METHOD_NUM)
+                       dicbit = MAX_DICBIT-1;          /* 15 bits */
                else /* LH5  LH4 is not used */
-                       dicbit = MAX_DICBIT - 2;        /* 13 bits */
+                       dicbit = MAX_DICBIT - 3;        /* 13 bits */
        }
 
        dicsiz = (((unsigned long)1) << dicbit);
@@ -136,7 +143,7 @@ encode_alloc(method)
        too_flag = (unsigned char*)malloc(HSHSIZ);
 
        if (hash == NULL || prev == NULL || text == NULL || too_flag == NULL)
-        exit(207);
+               exit(207);
 
        return method;
 }
@@ -306,7 +313,7 @@ struct interfacing *interface;
        init_slide();  
 
        encode_set.encode_start();
-       memset(&text[0], ' ', txtsiz);
+       memset(&text[0], ' ', (long)TXTSIZ);
 
        remainder = fread_crc(&text[dicsiz], txtsiz-dicsiz, infile);
        encoded_origsize = remainder;
@@ -314,7 +321,7 @@ struct interfacing *interface;
 
        pos = dicsiz;
 
-    if (matchlen > remainder) matchlen = remainder;
+       if (matchlen > remainder) matchlen = remainder;
        hval = ((((text[dicsiz] << 5) ^ text[dicsiz + 1]) << 5) 
                ^ text[dicsiz + 2]) & (unsigned)(HSHSIZ - 1);
 
@@ -371,7 +378,10 @@ void
 decode(interface)
        struct interfacing *interface;
 {
-       int             i, j, k, c, dicsiz1, offset;
+       unsigned int i, j, k, c;
+       unsigned int dicsiz1, offset;
+       unsigned char *dtext;
+       
 
 #ifdef DEBUG
        fout = fopen("de", "wt");
@@ -384,17 +394,18 @@ decode(interface)
        origsize = interface->original;
        compsize = interface->packed;
        decode_set = decode_define[interface->method - 1];
+
        crc = 0;
        prev_char = -1;
-       dicsiz = 1 << dicbit;
-       text = (unsigned char *) malloc(dicsiz);
-       if (text == NULL)
+       dicsiz = 1L << dicbit;
+       dtext = (unsigned char *) malloc(dicsiz);
+       if (dtext == NULL)
                /* error(MEMOVRERR, NULL); */
                exit(errno);
-       memset(text, ' ', dicsiz);
+       for (i=0; i<dicsiz; i++) dtext[i] = 0x20;
        decode_set.decode_start();
        dicsiz1 = dicsiz - 1;
-       offset = (interface->method == 7) ? 0x100 - 2 : 0x100 - 3;
+       offset = (interface->method == LARC_METHOD_NUM) ? 0x100 - 2 : 0x100 - 3;
        count = 0;
        loc = 0;
        while (count < origsize) {
@@ -403,9 +414,9 @@ decode(interface)
 #ifdef DEBUG
                  fprintf(fout, "%u C %02X\n", count, c);
 #endif
-                       text[loc++] = c;
+                       dtext[loc++] = c;
                        if (loc == dicsiz) {
-                               fwrite_crc(text, dicsiz, outfile);
+                               fwrite_crc(dtext, dicsiz, outfile);
                                loc = 0;
                        }
                        count++;
@@ -418,14 +429,14 @@ decode(interface)
 #endif
                        count += j;
                        for (k = 0; k < j; k++) {
-                               c = text[(i + k) & dicsiz1];
+                               c = dtext[(i + k) & dicsiz1];
 
 #ifdef DEBUG
                                fprintf(fout, "%02X ", c & 0xff);
 #endif
-                               text[loc++] = c;
+                               dtext[loc++] = c;
                                if (loc == dicsiz) {
-                                       fwrite_crc(text, dicsiz, outfile);
+                                       fwrite_crc(dtext, dicsiz, outfile);
                                        loc = 0;
                                }
                        }
@@ -435,10 +446,13 @@ decode(interface)
                }
        }
        if (loc != 0) {
-               fwrite_crc(text, loc, outfile);
+               fwrite_crc(dtext, loc, outfile);
        }
-       free(text);
+
+       free(dtext);
 }
+
 /* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
 /* End: */
index 79ab837..87c59af 100644 (file)
@@ -367,6 +367,9 @@ memset(s, c, n)
        return s;
 }
 #endif
+
 /* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
+/* compile-command:"gcc -c util.c" */
 /* End: */