1 /* ------------------------------------------------------------------------ */
3 /* util.c -- LHarc Util */
5 /* Modified Nobutaka Watazaki */
7 /* Ver. 1.14 Source All chagned 1995.01.14 N.Watazaki */
8 /* Ver. 1.14e Support for sfx archives 1999.05.28 T.Okamoto */
9 /* ------------------------------------------------------------------------ */
12 * util.c - part of LHa for UNIX Feb 26 1992 modified by Masaru Oki Mar 4
13 * 1992 modified by Masaru Oki #ifndef USESTRCASECMP added. Mar 31 1992
14 * modified by Masaru Oki #ifdef NOMEMSET added.
19 copyfile(f1, f2, size, text_flg, crcp) /* return: size of source file */
23 int text_flg; /* 0: binary, 1: read text, 2: write text */
33 buf = (char *)xmalloc(BUFFERSIZE);
35 INITIALIZE_CRC(*crcp);
41 xsize = fread_txt(buf, BUFFERSIZE, f1);
45 fatal_error("file read error");
49 xsize = (size > BUFFERSIZE) ? BUFFERSIZE : size;
50 if (fread(buf, 1, xsize, f1) != xsize) {
51 fatal_error("file read error");
58 if (fwrite_txt(buf, xsize, f2)) {
59 fatal_error("file write error");
63 if (fwrite(buf, 1, xsize, f2) != xsize) {
64 fatal_error("file write error");
70 *crcp = calccrc(*crcp, buf, xsize);
71 #ifdef NEED_INCREMENTAL_INDICATOR
82 encode_stored_crc(ifp, ofp, size, original_size_var, write_size_var)
85 long *original_size_var;
93 size = copyfile(ifp, ofp, size, 1, &crc);
94 *original_size_var = *write_size_var = size;
99 /* If TRUE, archive file name is msdos SFX file name. */
101 archive_is_msdos_sfx1(name)
104 int len = strlen(name);
107 if (strcasecmp(".COM", name + len - 4) == 0 ||
108 strcasecmp(".EXE", name + len - 4) == 0)
112 if (len >= 2 && strcasecmp(".x", name + len - 2) == 0)
128 if ((p = (char *) malloc(strlen(buf) + 1)) == NULL)
136 * memmove( char *dst , char *src , size_t cnt )
140 memmove(dst, src, cnt)
141 register char *dst, *src;
160 #ifndef HAVE_STRCASECMP
161 /* public domain rewrite of strcasecmp(3) */
170 if (toupper(*p1) != toupper(*p2))
171 return toupper(*p1) - toupper(*p2);
175 return strlen(p1) - strlen(p2);
180 /* Public Domain memset(3) */
197 xsnprintf(char *dest, size_t size, char *fmt, ...)
199 xsnprintf(dest, size, fmt, va_alist)
209 len = vsnprintf(dest, size, fmt, v);
223 #if !STRCHR_8BIT_CLEAN
224 /* 8 bit clean strchr()/strrchr()/memchr()/memrchr() */
226 xstrchr(const char *s, int c)
229 return s + strlen(s);
232 if ((unsigned char)*s == (unsigned char)c)
241 xstrrchr(const char *s, int c)
246 if ((unsigned char)*s == (unsigned char)c)
255 xmemchr(const char *s, int c, size_t n)
257 char *end = (char*)s + n;
260 if ((unsigned char)*s == (unsigned char)c)
269 xmemrchr(const char *s, int c, size_t n)
271 char *end = (char*)s-1;
276 if ((unsigned char)*s == (unsigned char)c)
285 #ifndef HAVE_BASENAME
295 /* strip trailing slashs */
296 t = s + strlen(s) - 1;
297 while (s != t && *t == '/')