+++ /dev/null
-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
-
,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 "
return crc;
}
+
/* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
/* End: */
/* 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;
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
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++;
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
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
{
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 */
}
/* ------------------------------------------------------------------------ */
#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;
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();
hdr->unix_gid = 0;
hdr->unix_uid = 0;
-
if (hdr->header_level == 0) {
extend_size = header_size - name_length -22;
if (extend_size < 0) {
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:
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:
#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 = "";
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;
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)
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;
}
}
/* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
+/* compile-command:"gcc -c header.c" */
/* End: */
/* 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"
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;
{
int i;
+#if 0
if (dicbit <= (MAX_DICBIT - 2)) {
pbit = 4; /* lh4,5 etc. */
np = 14;
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;
short nbit;
short i_special;
{
- short i, c, n;
+ int i, c, n;
n = getbits(nbit);
if (n == 0) {
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 */
/* 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...
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;
void sjis2euc(int *p1, int *p2);
/* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
/* End: */
+
+
/* 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>
(((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)
#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-"
#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
*/
/* 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) */
/* 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: */
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++;
}
/* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
+/* compile-command:"gcc -c lhadd.c" */
/* End: */
/* 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
/* static functions */
static void sort_files();
+static void print_version();
char *extract_directory = NULL;
char **xfilev;
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;
ignore_directory = FALSE;
verify_mode = FALSE;
+ noconvertcase = FALSE;
+
extract_directory = NULL;
xfilec = 257;
}
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\
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
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 */
break;
case 'g':
generic_format = TRUE;
+ noconvertcase = TRUE;
header_level = 0;
break;
case 'd':
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;
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;
return 0;
}
+
+/* ------------------------------------------------------------------------ */
+/* */
+/* ------------------------------------------------------------------------ */
+
+/* ------------------------------------------------------------------------ */
+static void
+print_version()
+{
+ fprintf(stderr, "%s\n", LHA_VERSION);
+}
+
/* ------------------------------------------------------------------------ */
static void
message_1(title, subject, name)
else {
sprintf(temporary_name, "%s/lhXXXXXX", extract_directory);
}
+#ifdef MKSTEMP
+ mkstemp(temporary_name);
+#else
mktemp(temporary_name);
+#endif
#else
char *p, *s;
if (*p == '/')
s = p;
strcpy((s ? s + 1 : temporary_name), "lhXXXXXX");
+#ifdef MKSTEMP
+ mkstemp(temporary_name);
+#else
mktemp(temporary_name);
#endif
+#endif
}
/* ------------------------------------------------------------------------ */
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: */
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
#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;
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 {
return;
}
+
/* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
/* End: */
char *p, *q;
if (verbose_listing) {
- p = "PACKED SIZE RATIO CRC ";
+ p = "PACKED SIZE RATIO METHOD CRC";
q = " NAME";
}
else {
}
if (verbose)
- printf("(%d)", hdr->header_level);
+ printf(" [%d]", hdr->header_level);
printf("\n");
}
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);
return;
}
+
/* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
+/* compile-command:"gcc -c lhlist.c" */
/* End: */
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;
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;
}
/* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
/* End: */
}
/* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
/* End: */
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
+
}
/* ------------------------------------------------------------------------ */
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++)
}
return (j << 6) + getbits(6);
}
+
/* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
/* End: */
{(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}
{(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}
{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 */
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
} 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);
too_flag = (unsigned char*)malloc(HSHSIZ);
if (hash == NULL || prev == NULL || text == NULL || too_flag == NULL)
- exit(207);
+ exit(207);
return method;
}
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;
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);
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");
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) {
#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++;
#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;
}
}
}
}
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: */
return s;
}
#endif
+
/* Local Variables: */
-/* tab-width : 4 */
+/* mode:c */
+/* tab-width:4 */
+/* compile-command:"gcc -c util.c" */
/* End: */