"SfR Fresh" - the SfR Freeware/Shareware Archive 
Member "lha-114i/src/lhlist.c" of archive lha-114i.tar.gz:
As a special service "SfR Fresh" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting with prefixed line numbers.
Alternatively you can here view or download the uninterpreted source code file.
That can be also achieved for any archive member file by clicking within an archive contents listing on the first character of the file(path) respectively on the according byte size field.
1 /* ------------------------------------------------------------------------ */
2 /* LHa for UNIX */
3 /* lhlist.c -- LHarc list */
4 /* */
5 /* Copyright (C) MCMLXXXIX Yooichi.Tagawa */
6 /* Modified Nobutaka Watazaki */
7 /* */
8 /* Ver. 0.00 Original 1988.05.23 Y.Tagawa */
9 /* Ver. 1.00 Fixed 1989.09.22 Y.Tagawa */
10 /* Ver. 1.01 Bug Fix for month name 1989.12.25 Y.Tagawa */
11 /* Ver. 1.10 Changed list format 1993.10.01 N.Watazaki */
12 /* Ver. 1.14 Source All chagned 1995.01.14 N.Watazaki */
13 /* Ver. 1.14e Bug Fix for many problems 1999.05.25 T.Okamoto */
14 /* ------------------------------------------------------------------------ */
15 #include "lha.h"
16
17 /* ------------------------------------------------------------------------ */
18 static long packed_size_total;
19 static long original_size_total;
20 static int list_files;
21
22 /* ------------------------------------------------------------------------ */
23 /* Print Stuff */
24 /* ------------------------------------------------------------------------ */
25 /* need 14 or 22 (when verbose_listing is TRUE) column spaces */
26 static void
27 print_size(packed_size, original_size)
28 long packed_size, original_size;
29 {
30 if (verbose_listing)
31 printf("%7d ", packed_size);
32
33 printf("%7d ", original_size);
34
35 if (original_size == 0L)
36 printf("******");
37 else /* Changed N.Watazaki */
38 printf("%5.1f%%", packed_size * 100.0 / original_size);
39 }
40
41 /* ------------------------------------------------------------------------ */
42 /* need 12 or 17 (when verbose_listing is TRUE) column spaces */
43 static void
44 print_stamp(t)
45 time_t t;
46 {
47 static boolean got_now = FALSE;
48 static time_t now;
49 static unsigned int threshold;
50 static char t_month[12 * 3 + 1] = "JanFebMarAprMayJunJulAugSepOctNovDec";
51 struct tm *p;
52
53 if (t == 0) {
54 printf(" "); /* 12 spaces */
55 return;
56 }
57
58 if (!got_now) {
59 now = time((time_t *) 0);
60 p = localtime(&now);
61 threshold = p->tm_year * 12 + p->tm_mon - 6;
62 got_now = TRUE;
63 }
64
65 p = localtime(&t);
66
67 if (p->tm_year * 12 + p->tm_mon > threshold)
68 printf("%.3s %2d %02d:%02d",
69 &t_month[p->tm_mon * 3], p->tm_mday, p->tm_hour, p->tm_min);
70 else
71 printf("%.3s %2d %04d",
72 &t_month[p->tm_mon * 3], p->tm_mday, p->tm_year + 1900);
73 }
74
75 /* ------------------------------------------------------------------------ */
76 static void
77 print_bar()
78 {
79 char *p, *q;
80 /* 17+1+(0 or 7+1)+7+1+6+1+(0 or 1+4)+(12 or 17)+1+20 */
81 /* 12345678901234567_ 1234567_123456 _123456789012 1234 */
82
83 if (verbose_listing) {
84 p = "- ------ ---------- ";
85 q = " -------------";
86 }
87 else {
88 p = " ";
89 q = " --------------------";
90 }
91
92 if (verbose)
93 q = "";
94
95 printf("---------- ----------- ------- ------%s------------%s\n", p, q);
96 }
97
98 /* ------------------------------------------------------------------------ */
99 /* */
100 /* ------------------------------------------------------------------------ */
101 static void
102 list_header()
103 {
104 char *p, *q;
105
106 if (verbose_listing) {
107 p = "PACKED SIZE RATIO METHOD CRC";
108 q = " NAME";
109 }
110 else {
111 p = " SIZE RATIO";
112 q = " NAME";
113 }
114
115 if (verbose)
116 q = "";
117
118 printf(" PERMSSN UID GID %s STAMP%s\n", p, q);
119 #if 0
120 printf(" PERMSSN UID GID %s SIZE RATIO%s %s STAMP%s%s\n",
121 verbose_listing ? " PACKED " : "", /* 8,0 */
122 verbose_listing ? " CRC" : "", /* 5,0 */
123 verbose_listing ? " " : "", /* 2,0 */
124 verbose_listing ? " " : " ", /* 6,3 */
125 verbose ? "" : " NAME");
126 #endif
127 print_bar();
128 }
129
130 /* ------------------------------------------------------------------------ */
131 static void
132 list_one(hdr)
133 register LzHeader *hdr;
134 {
135 register int mode;
136 register char *p;
137 char method[6];
138 char modebits[11];
139
140 if (verbose)
141 printf("%s\n", hdr->name);
142
143 strncpy(method, hdr->method, 5);
144 method[5] = '\0';
145
146 switch (mode = hdr->extend_type) {
147 case EXTEND_UNIX:
148 mode = hdr->unix_mode;
149
150 if (mode & UNIX_FILE_DIRECTORY)
151 modebits[0] = 'd';
152 else if ((mode & UNIX_FILE_SYMLINK) == UNIX_FILE_SYMLINK)
153 modebits[0] = 'l';
154 else
155 modebits[0] = '-';
156 modebits[1] = ((mode & UNIX_OWNER_READ_PERM) ? 'r' : '-');
157 modebits[2] = ((mode & UNIX_OWNER_WRITE_PERM) ? 'w' : '-');
158 modebits[3] = (mode & UNIX_SETUID) ? 's' :
159 ((mode & UNIX_OWNER_EXEC_PERM) ? 'x' : '-');
160 modebits[4] = ((mode & UNIX_GROUP_READ_PERM) ? 'r' : '-');
161 modebits[5] = ((mode & UNIX_GROUP_WRITE_PERM) ? 'w' : '-');
162 modebits[6] = (mode & UNIX_SETGID) ? 's' :
163 ((mode & UNIX_GROUP_EXEC_PERM) ? 'x' : '-');
164 modebits[7] = ((mode & UNIX_OTHER_READ_PERM) ? 'r' : '-');
165 modebits[8] = ((mode & UNIX_OTHER_WRITE_PERM) ? 'w' : '-');
166 modebits[9] = (mode & UNIX_STYCKYBIT) ? 't' :
167 ((mode & UNIX_OTHER_EXEC_PERM) ? 'x' : '-');
168 modebits[10] = 0;
169
170 printf("%s %5d/%-5d ", modebits,
171 hdr->unix_uid, hdr->unix_gid);
172 break;
173 case EXTEND_OS68K:
174 /**/ case EXTEND_XOSK:/**/
175 mode = hdr->unix_mode;
176 printf("%c%c%c%c%c%c%c%c %5d/%-5d",
177 ((mode & OSK_DIRECTORY_PERM) ? 'd' : '-'),
178 ((mode & OSK_SHARED_PERM) ? 's' : '-'),
179 ((mode & OSK_OTHER_EXEC_PERM) ? 'e' : '-'),
180 ((mode & OSK_OTHER_WRITE_PERM) ? 'w' : '-'),
181 ((mode & OSK_OTHER_READ_PERM) ? 'r' : '-'),
182 ((mode & OSK_OWNER_EXEC_PERM) ? 'e' : '-'),
183 ((mode & OSK_OWNER_WRITE_PERM) ? 'w' : '-'),
184 ((mode & OSK_OWNER_READ_PERM) ? 'r' : '-'),
185 hdr->unix_uid, hdr->unix_gid);
186 break;
187 default:
188 switch (hdr->extend_type) { /* max 18 characters */
189 case EXTEND_GENERIC:
190 p = "[generic]";
191 break;
192 case EXTEND_CPM:
193 p = "[CP/M]";
194 break;
195 case EXTEND_FLEX:
196 p = "[FLEX]";
197 break;
198 case EXTEND_OS9:
199 p = "[OS-9]";
200 break;
201 case EXTEND_OS68K:
202 p = "[OS-9/68K]";
203 break;
204 case EXTEND_MSDOS:
205 p = "[MS-DOS]";
206 break;
207 case EXTEND_MACOS:
208 p = "[Mac OS]";
209 break;
210 case EXTEND_OS2:
211 p = "[OS/2]";
212 break;
213 case EXTEND_HUMAN:
214 p = "[Human68K]";
215 break;
216 case EXTEND_OS386:
217 p = "[OS-386]";
218 break;
219 case EXTEND_RUNSER:
220 p = "[Runser]";
221 break;
222 #ifdef EXTEND_TOWNSOS
223 /* This ID isn't fixed */
224 case EXTEND_TOWNSOS:
225 p = "[TownsOS]";
226 break;
227 #endif
228 /* Ouch! Please customize it's ID. */
229 default:
230 p = "[unknown]";
231 break;
232 }
233 printf("%-23.23s", p);
234 break;
235 }
236
237 print_size(hdr->packed_size, hdr->original_size);
238
239 if (verbose_listing)
240 if (hdr->has_crc)
241 printf(" %s %04x", method, hdr->crc);
242 else
243 printf(" %s ****", method);
244
245 printf(" ");
246 print_stamp(hdr->unix_last_modified_stamp);
247
248 if (!verbose)
249 if ((mode & UNIX_FILE_SYMLINK) != UNIX_FILE_SYMLINK)
250 printf(" %s", hdr->name);
251 else {
252 char buf[256], *b1, *b2;
253 strcpy(buf, hdr->name);
254 b1 = strtok(buf, "|");
255 b2 = strtok(NULL, "|");
256 printf(" %s -> %s", b1, b2);
257 }
258
259 if (verbose)
260 printf(" [%d]", hdr->header_level);
261 printf("\n");
262
263 }
264
265 /* ------------------------------------------------------------------------ */
266 static void
267 list_tailer()
268 {
269 struct stat stbuf;
270
271 print_bar();
272
273 printf(" Total %9d file%c ",
274 list_files, (list_files == 1) ? ' ' : 's');
275 print_size(packed_size_total, original_size_total);
276 printf(" ");
277
278 if (verbose_listing)
279 printf(" ");
280
281 if (stat(archive_name, &stbuf) < 0)
282 print_stamp((time_t) 0);
283 else
284 print_stamp(stbuf.st_mtime);
285
286 printf("\n");
287 }
288
289 /* ------------------------------------------------------------------------ */
290 /* LIST COMMAND MAIN */
291 /* ------------------------------------------------------------------------ */
292 void
293 cmd_list()
294 {
295 FILE *afp;
296 LzHeader hdr;
297 int i;
298
299 /* initialize total count */
300 packed_size_total = 0L;
301 original_size_total = 0L;
302 list_files = 0;
303
304 /* open archive file */
305 if ((afp = open_old_archive()) == NULL) {
306 error(archive_name, "");
307 exit(1);
308 }
309 if (archive_is_msdos_sfx1(archive_name))
310 skip_msdos_sfx1_code(afp);
311
312 /* print header message */
313 if (!quiet)
314 list_header();
315
316 /* print each file information */
317 while (get_header(afp, &hdr)) {
318 if (need_file(hdr.name)) {
319 list_one(&hdr);
320 list_files++;
321 packed_size_total += hdr.packed_size;
322 original_size_total += hdr.original_size;
323 }
324
325 if (afp != stdin)
326 fseek(afp, hdr.packed_size, SEEK_CUR);
327 else {
328 i = hdr.packed_size;
329 while (i--)
330 fgetc(afp);
331 }
332 }
333
334 /* close archive file */
335 fclose(afp);
336
337 /* print tailer message */
338 if (!quiet)
339 list_tailer();
340
341 return;
342 }
343
344 /* Local Variables: */
345 /* mode:c */
346 /* tab-width:4 */
347 /* compile-command:"gcc -c lhlist.c" */
348 /* End: */