comparison lwar/add.c @ 378:1c31e9005ff7

Brought forward lwlink, lwar, and lwobjdump along with some misc junk
author lost@starbug
date Mon, 26 Apr 2010 19:30:44 -0600
parents old-trunk/lwar/add.c@eb230fa7d28e
children
comparison
equal deleted inserted replaced
377:55ed7d06b136 378:1c31e9005ff7
1 /*
2 add.c
3 Copyright © 2009 William Astle
4
5 This file is part of LWAR.
6
7 LWAR is free software: you can redistribute it and/or modify it under the
8 terms of the GNU General Public License as published by the Free Software
9 Foundation, either version 3 of the License, or (at your option) any later
10 version.
11
12 This program is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 more details.
16
17 You should have received a copy of the GNU General Public License along with
18 this program. If not, see <http://www.gnu.org/licenses/>.
19
20
21 Implements the program startup code
22
23 */
24
25 #include <config.h>
26
27 #include <errno.h>
28 #include <stdio.h>
29 #include <stdlib.h>
30
31 #include "lwar.h"
32
33 void do_add(void)
34 {
35 FILE *f;
36 unsigned char buf[8];
37 long l;
38 int c;
39 FILE *f2;
40 int i;
41
42 f = fopen(archive_file, "r+");
43 if (!f)
44 {
45 if (errno == ENOENT)
46 {
47 f = fopen(archive_file, "w");
48 if (f)
49 {
50 fputs("LWAR1V", f);
51 goto doadd;
52 }
53 }
54 perror("Cannot open archive file");
55 }
56
57 fread(buf, 1, 6, f);
58 if (memcmp("LWAR1V", buf, 6))
59 {
60 fprintf(stderr, "%s is not a valid archive file.\n", archive_file);
61 exit(1);
62 }
63
64 for (;;)
65 {
66 c = fgetc(f);
67 if (c == EOF && ferror(f))
68 {
69 perror("Reading archive file");
70 exit(1);
71 }
72 if (c == EOF)
73 goto doadd;
74
75 if (!c)
76 {
77 fseek(f, -1, SEEK_CUR);
78 goto doadd;
79 }
80
81 // find the end of the file name
82 while (c)
83 {
84 c = fgetc(f);
85 if (c == EOF || ferror(f))
86 {
87 fprintf(stderr, "Bad archive file\n");
88 exit(1);
89 }
90 }
91
92 // get length of archive member
93 l = 0;
94 c = fgetc(f);
95 l = c << 24;
96 c = fgetc(f);
97 l |= c << 16;
98 c = fgetc(f);
99 l |= c << 8;
100 c = fgetc(f);
101 l |= c;
102
103 fseek(f, l, SEEK_CUR);
104 }
105 // back up to the NUL byte at the end of the file
106 fseek(f, -1, SEEK_CUR);
107 doadd:
108 for (i = 0; i < nfiles; i++)
109 {
110 f2 = fopen(files[i], "r");
111 if (!f2)
112 {
113 fprintf(stderr, "Cannot open file %s:", files[i]);
114 perror("");
115 exit(1);
116 }
117 fread(buf, 1, 6, f2);
118 if (mergeflag && !memcmp("LWAR1V", buf, 6))
119 {
120 // add archive contents...
121 for (;;)
122 {
123 c = fgetc(f2);
124 if (c == EOF || ferror(f2))
125 {
126 perror("Reading input archive file");
127 exit(1);
128 }
129 if (c == EOF)
130 break;
131
132 if (!c)
133 {
134 break;
135 }
136
137 // find the end of the file name
138 while (c)
139 {
140 fputc(c, f);
141 c = fgetc(f2);
142 if (c == EOF || ferror(f))
143 {
144 fprintf(stderr, "Bad input archive file\n");
145 exit(1);
146 }
147 }
148 fputc(0, f);
149
150 // get length of archive member
151 l = 0;
152 c = fgetc(f2);
153 fputc(c, f);
154 l = c << 24;
155 c = fgetc(f2);
156 fputc(c, f);
157 l |= c << 16;
158 c = fgetc(f2);
159 fputc(c, f);
160 l |= c << 8;
161 c = fgetc(f2);
162 fputc(c, f);
163 l |= c;
164
165 while (l)
166 {
167 c = fgetc(f2);
168 fputc(c, f);
169 l--;
170 }
171 }
172
173 fclose(f2);
174 continue;
175 }
176 fseek(f2, 0, SEEK_END);
177 l = ftell(f2);
178 fseek(f2, 0, SEEK_SET);
179 fputs(files[i], f);
180 fputc(0, f);
181 fputc(l >> 24, f);
182 fputc((l >> 16) & 0xff, f);
183 fputc((l >> 8) & 0xff, f);
184 fputc(l & 0xff, f);
185 while (l)
186 {
187 c = fgetc(f2);
188 fputc(c, f);
189 l--;
190 }
191 }
192
193 // flag end of file
194 fputc(0, f);
195 }