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");
62 if (fwrite_txt(buf, xsize, f2)) {
63 fatal_error("file write error");
67 if (fwrite(buf, 1, xsize, f2) != xsize) {
68 fatal_error("file write error");
75 *crcp = calccrc(*crcp, buf, xsize);
76 #ifdef NEED_INCREMENTAL_INDICATOR
87 encode_stored_crc(ifp, ofp, size, original_size_var, write_size_var)
90 size_t *original_size_var;
91 size_t *write_size_var;
98 size = copyfile(ifp, ofp, size, 1, &crc);
99 *original_size_var = *write_size_var = size;
104 /* If TRUE, archive file name is msdos SFX file name. */
106 archive_is_msdos_sfx1(name)
109 int len = strlen(name);
112 if (strcasecmp(".COM", name + len - 4) == 0 ||
113 strcasecmp(".EXE", name + len - 4) == 0)
117 if (len >= 2 && strcasecmp(".x", name + len - 2) == 0)
133 if ((p = (char *) malloc(strlen(buf) + 1)) == NULL)
135 strcpy(p, buf); /* ok */
141 * memmove( char *dst , char *src , size_t cnt )
145 memmove(dst, src, cnt)
146 register char *dst, *src;
165 #ifndef HAVE_STRCASECMP
166 /* public domain rewrite of strcasecmp(3) */
175 if (toupper(*p1) != toupper(*p2))
176 return toupper(*p1) - toupper(*p2);
180 return strlen(p1) - strlen(p2);
185 /* Public Domain memset(3) */
202 xsnprintf(char *dest, size_t size, char *fmt, ...)
204 xsnprintf(dest, size, fmt, va_alist)
214 len = vsnprintf(dest, size, fmt, v);
228 #if !STRCHR_8BIT_CLEAN
229 /* 8 bit clean strchr()/strrchr()/memchr()/memrchr() */
231 xstrchr(const char *s, int c)
234 return s + strlen(s);
237 if ((unsigned char)*s == (unsigned char)c)
246 xstrrchr(const char *s, int c)
251 if ((unsigned char)*s == (unsigned char)c)
260 xmemchr(const char *s, int c, size_t n)
262 char *end = (char*)s + n;
265 if ((unsigned char)*s == (unsigned char)c)
274 xmemrchr(const char *s, int c, size_t n)
276 char *end = (char*)s-1;
281 if ((unsigned char)*s == (unsigned char)c)
290 #ifndef HAVE_BASENAME
300 /* strip trailing slashs */
301 t = s + strlen(s) - 1;
302 while (s != t && *t == '/')
316 /* This function is similar to strncpy() but `dst' is always terminated '\0'.
317 Return the copied string length. */
319 str_safe_copy(char *dst, const char *src, int dstsz)
323 if (dstsz < 1) return 0;
325 for (i = 0; i < dstsz; i++) {
326 if ((dst[i] = src[i]) == '\0')
330 /* here is i == dstsz */
331 dst[--i] = '\0'; /* if eliminated this line,
332 this function was same as strncpy(). */