OSDN Git Service

* src/lharc.c (init_variable): do not use HEADER_LEVELx macros.
[lha/lha.git] / src / util.c
1 /* ------------------------------------------------------------------------ */
2 /* LHa for UNIX                                                             */
3 /*              util.c -- LHarc Util                                        */
4 /*                                                                          */
5 /*      Modified                Nobutaka Watazaki                           */
6 /*                                                                          */
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 /* ------------------------------------------------------------------------ */
10 #include "lha.h"
11 /*
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.
15  */
16 #include <errno.h>
17
18 long
19 copyfile(f1, f2, size, text_flg, crcp)  /* return: size of source file */
20     FILE *f1;
21     FILE *f2;
22     long size;
23     int text_flg;               /* 0: binary, 1: read text, 2: write text */
24     unsigned int *crcp;
25 {
26     unsigned short  xsize;
27     char *buf;
28     long rsize = 0;
29
30     if (!text_mode)
31         text_flg = 0;
32
33     buf = (char *)xmalloc(BUFFERSIZE);
34     if (crcp)
35         INITIALIZE_CRC(*crcp);
36     if (text_flg)
37         init_code_cache();
38     while (size > 0) {
39         /* read */
40         if (text_flg & 1) {
41             xsize = fread_txt(buf, BUFFERSIZE, f1);
42             if (xsize == 0)
43                 break;
44             if (ferror(f1)) {
45                 fatal_error("file read error");
46             }
47         }
48         else {
49             xsize = (size > BUFFERSIZE) ? BUFFERSIZE : size;
50             if (fread(buf, 1, xsize, f1) != xsize) {
51                 fatal_error("file read error");
52             }
53             size -= xsize;
54         }
55         /* write */
56         if (f2) {
57             if (text_flg & 2) {
58                 if (fwrite_txt(buf, xsize, f2)) {
59                     fatal_error("file write error");
60                 }
61             }
62             else {
63                 if (fwrite(buf, 1, xsize, f2) != xsize) {
64                     fatal_error("file write error");
65                 }
66             }
67         }
68         /* calculate crc */
69         if (crcp) {
70             *crcp = calccrc(*crcp, buf, xsize);
71 #ifdef NEED_INCREMENTAL_INDICATOR
72             put_indicator(xsize);
73 #endif
74         }
75         rsize += xsize;
76     }
77     free(buf);
78     return rsize;
79 }
80
81 int
82 encode_stored_crc(ifp, ofp, size, original_size_var, write_size_var)
83     FILE *ifp, *ofp;
84     long size;
85     long *original_size_var;
86     long *write_size_var;
87 {
88     int save_quiet;
89     unsigned int crc;
90
91     save_quiet = quiet;
92     quiet = 1;
93     size = copyfile(ifp, ofp, size, 1, &crc);
94     *original_size_var = *write_size_var = size;
95     quiet = save_quiet;
96     return crc;
97 }
98
99 /* If TRUE, archive file name is msdos SFX file name. */
100 boolean
101 archive_is_msdos_sfx1(name)
102     char *name;
103 {
104     int len = strlen(name);
105
106     if (len >= 4) {
107         if (strcasecmp(".COM", name + len - 4) == 0 ||
108             strcasecmp(".EXE", name + len - 4) == 0)
109             return 1;
110     }
111
112     if (len >= 2 && strcasecmp(".x", name + len - 2) == 0)
113         return 1;
114
115     return 0;
116 }
117
118 /*
119  * strdup(3)
120  */
121 #ifndef HAVE_STRDUP
122 char *
123 strdup(buf)
124     const char *buf;
125 {
126     char *p;
127
128     if ((p = (char *) malloc(strlen(buf) + 1)) == NULL)
129         return NULL;
130     strcpy(p, buf);
131     return p;
132 }
133 #endif
134
135 /*
136  * memmove( char *dst , char *src , size_t cnt )
137  */
138 #ifndef HAVE_MEMMOVE
139 void *
140 memmove(dst, src, cnt)
141     register char *dst, *src;
142     register int cnt;
143 {
144     if (dst == src)
145         return dst;
146     if (src > dst) {
147         while (--cnt >= 0)
148             *dst++ = *src++;
149     }
150     else {
151         dst += cnt;
152         src += cnt;
153         while (--cnt >= 0)
154             *--dst = *--src;
155     }
156     return dst;
157 }
158 #endif
159
160 #ifndef HAVE_STRCASECMP
161 /* public domain rewrite of strcasecmp(3) */
162
163 #include <ctype.h>
164
165 int
166 strcasecmp(p1, p2)
167     const char *p1, *p2;
168 {
169     while (*p1 && *p2) {
170         if (toupper(*p1) != toupper(*p2))
171             return toupper(*p1) - toupper(*p2);
172         p1++;
173         p2++;
174     }
175     return strlen(p1) - strlen(p2);
176 }
177 #endif
178
179 #ifndef HAVE_MEMSET
180 /* Public Domain memset(3) */
181 char *
182 memset(s, c, n)
183     char *s;
184     int c;
185     size_t n;
186 {
187     char *p = s;
188
189     while (n--)
190         *p++ = (char) c;
191     return s;
192 }
193 #endif
194
195 int
196 #if STDC_HEADERS
197 xsnprintf(char *dest, size_t size, char *fmt, ...)
198 #else
199 xsnprintf(dest, size, fmt, va_alist)
200     char *dest, *fmt;
201     size_t size;
202     va_dcl
203 #endif
204 {
205     int len;
206     va_list v;
207
208     va_init(v, fmt);
209     len = vsnprintf(dest, size, fmt, v);
210     va_end(v);
211
212     if (len == -1)
213         return -1;
214
215     if (len >= size) {
216         dest[size-1] = 0;
217         return -1;
218     }
219
220     return 0;
221 }
222
223 #if !STRCHR_8BIT_CLEAN
224 /* 8 bit clean strchr()/strrchr()/memchr()/memrchr() */
225 char *
226 xstrchr(const char *s, int c)
227 {
228     if (c == 0)
229         return s + strlen(s);
230
231     while (*s) {
232         if ((unsigned char)*s == (unsigned char)c)
233             return (char*)s;
234         s++;
235     }
236
237     return 0;
238 }
239
240 char *
241 xstrrchr(const char *s, int c)
242 {
243     char *p = 0;
244
245     while (*s) {
246         if ((unsigned char)*s == (unsigned char)c)
247             p = (char*)s;
248         s++;
249     }
250
251     return p;
252 }
253
254 char *
255 xmemchr(const char *s, int c, size_t n)
256 {
257     char *end = (char*)s + n;
258
259     while (s != end) {
260         if ((unsigned char)*s == (unsigned char)c)
261             return (char*)s;
262         s++;
263     }
264
265     return 0;
266 }
267
268 char *
269 xmemrchr(const char *s, int c, size_t n)
270 {
271     char *end = (char*)s-1;
272     char *p = 0;
273
274     s += n-1;
275     while (s != end) {
276         if ((unsigned char)*s == (unsigned char)c)
277             p = (char*)s;
278         s--;
279     }
280
281     return p;
282 }
283 #endif
284
285 #ifndef HAVE_BASENAME
286 char *
287 basename(char *s)
288 {
289     int len;
290     char *t;
291
292     if (!s || *s == 0)
293         return ".";
294
295     /* strip trailing slashs */
296     t = s + strlen(s) - 1;
297     while (s != t && *t == '/')
298         *t-- = '\0';
299     if (s == t)
300         return s;
301
302     t = strrchr(s, '/');
303     if (t)
304         return t + 1;
305     else
306         return s;
307
308 }
309 #endif