4
Copyright (C) 1994 M. Hagiya, W. Schelter, T. Yuasa
6
This file is part of GNU Common Lisp, herein referred to as GCL
8
GCL is free software; you can redistribute it and/or modify it under
9
the terms of the GNU LIBRARY GENERAL PUBLIC LICENSE as published by
10
the Free Software Foundation; either version 2, or (at your option)
13
GCL is distributed in the hope that it will be useful, but WITHOUT
14
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
16
License for more details.
18
You should have received a copy of the GNU Library General Public License
19
along with GCL; see the file COPYING. If not, write to the Free Software
20
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
30
/* When MACHINE is S3000, use fcntl.h */
89
#define a_trsize rtsize
90
#define a_drsize rdsize
91
#define SEGSIZ (128*1024)
92
#define TXTRELOC (1024*1024)
104
fread(buffer, BUFSIZ, 1, from);
105
fwrite(buffer, BUFSIZ, 1, to);
108
fread(buffer, 1, n, from);
109
fwrite(buffer, 1, n, to);
116
memory_save(original_file, save_file)
117
char *original_file, *save_file;
127
struct filehdr filehdr;
128
struct aouthdr aouthdr;
140
struct filehdr *pfilehdr;
141
struct aouthdr *paouthdr;
142
struct scnhdr *pscnhdr;
145
int fptr, nbytes, pagesize;
146
#define setbuf(stream,buf)
148
struct filehdr fileheader;
157
char *data_begin, *data_end;
159
FILE *original, *save;
165
original = fopen(original_file, "r");
166
if (stdin != original || original->_file != 0) {
167
fprintf(stderr, "Can't open the original file.\n");
170
setbuf(original, stdin_buf);
173
n = open(save_file, O_CREAT|O_WRONLY, 0777);
174
if (n != 1 || (save = fdopen(n, "w")) != stdout) {
175
fprintf(stderr, "Can't open the save file.\n");
178
setbuf(save, stdout_buf);
181
fread(&header, sizeof(header), 1, original);
185
= (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
189
= (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
192
data_begin = (char *)N_DATADDR(header);
195
data_begin = (char *)N_DATADDR(header);
199
= (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
215
original_data = header.a_data;
216
header.a_data = data_end - data_begin;
218
fwrite(&header, sizeof(header), 1, save);
221
if (header.a_magic == ZMAGIC)
222
filecpy(save, original, PAGSIZ - sizeof(header));
223
filecpy(save, original, header.a_text);
226
if (header.a_magic == ZMAGIC)
227
filecpy(save, original, PAGSIZ - sizeof(header));
228
filecpy(save, original, header.a_text);
231
filecpy(save, original, header.a_text - sizeof(header));
234
filecpy(save, original, header.a_text - sizeof(header));
237
if (header.a_magic == ZMAGIC)
238
filecpy(save, original, PAGSIZ - sizeof(header));
239
filecpy(save, original, header.a_text);
261
read(0, (char*)&hdrs.filehdr, FILHSZ + AOUTHSZ);
262
pfilehdr = (struct filehdr*)hdrs.aouthdr.text_start;
263
paouthdr = (struct aouthdr*)((long)pfilehdr + FILHSZ);
264
pscnhdr = (struct scnhdr*)((long)paouthdr + AOUTHSZ);
266
pagesize = getpagesize();
269
((long)core_end - hdrs.aouthdr.data_start + pagesize - 1)
271
hdrs.aouthdr.bss_start =
272
hdrs.aouthdr.data_start + hdrs.aouthdr.dsize;
273
hdrs.aouthdr.bsize = 0;
275
hdrs.filehdr.f_nscns = NSCNS;
276
hdrs.filehdr.f_timdat = time(NULL);
277
hdrs.filehdr.f_symptr = hdrs.aouthdr.tsize + hdrs.aouthdr.dsize;
279
bcopy((char*)pscnhdr, (char*)&hdrs.text_section, NSCNS * SCNHSZ);
280
hdrs.data_section.s_size = hdrs.aouthdr.dsize
281
- hdrs.rdata_section.s_size;
282
bzero((char*)&hdrs.lit8_section,
283
sizeof hdrs - FILHSZ - AOUTHSZ - NSCNS * SCNHSZ);
284
fptr = write(1, &hdrs, AOUTHSZ + FILHSZ + pfilehdr->f_nscns * SCNHSZ);
286
p = (char*)hdrs.aouthdr.text_start + fptr;
287
n = hdrs.aouthdr.tsize - fptr;
288
nbytes = pagesize - fptr;
292
while ( n > pagesize ) {
293
write(1, p, pagesize);
300
lseek(1, hdrs.rdata_section.s_scnptr, SEEK_SET);
301
p = (char*)hdrs.aouthdr.data_start;
302
n = hdrs.aouthdr.dsize;
303
while ( n > pagesize ) {
304
write(1, p, pagesize);
311
lseek(0, pfilehdr->f_symptr, SEEK_SET);
312
diff = hdrs.filehdr.f_symptr - pfilehdr->f_symptr;
313
read(0, &symhdr, cbHDRR);
315
#define adjust(field)if(symhdr.cb/**/field/**/Offset)symhdr.cb/**/field/**/Offset+= diff
317
#define adjust(field)if(symhdr.cb##field##Offset)symhdr.cb##field##Offset+= diff
331
write(1, &symhdr, cbHDRR);
332
while ( (n = read(0, buf, sizeof buf)) > 0 )
335
fread(&fileheader, sizeof(fileheader), 1, original);
336
fread(&header, sizeof(header), 1, original);
337
data_begin = (char *)header.data_start;
339
original_data = header.a_data;
340
header.a_data = data_end - data_begin;
341
diff = header.a_data - original_data;
342
header.a_bss = sbrk(0) - core_end;
343
fileheader.f_symptr += diff;
344
fwrite(&fileheader, sizeof(fileheader), 1, save);
345
fwrite(&header, sizeof(header), 1, save);
346
fread(§ionheader, sizeof(sectionheader), 1, original);
347
if (sectionheader.s_lnnoptr)
348
sectionheader.s_lnnoptr += diff;
349
fwrite(§ionheader, sizeof(sectionheader), 1, save);
350
fread(§ionheader, sizeof(sectionheader), 1, original);
351
sectionheader.s_size += diff;
352
if (sectionheader.s_lnnoptr)
353
sectionheader.s_lnnoptr += diff;
354
fwrite(§ionheader, sizeof(sectionheader), 1, save);
355
fread(§ionheader, sizeof(sectionheader), 1, original);
356
sectionheader.s_paddr += diff;
357
sectionheader.s_vaddr += diff;
358
sectionheader.s_size = header.a_bss;
360
if (sectionheader.s_scnptr)
361
sectionheader.s_scnptr += diff;
363
if (sectionheader.s_lnnoptr)
364
sectionheader.s_lnnoptr += diff;
365
fwrite(§ionheader, sizeof(sectionheader), 1, save);
366
for (n = 4; n <= fileheader.f_nscns; n++) {
367
fread(§ionheader, sizeof(sectionheader), 1, original);
368
if (sectionheader.s_scnptr)
369
sectionheader.s_scnptr += diff;
370
if (sectionheader.s_lnnoptr)
371
sectionheader.s_lnnoptr += diff;
372
fwrite(§ionheader, sizeof(sectionheader), 1, save);
374
filecpy(save, original, header.a_text);
379
fread(&header, sizeof(header), 1, original);
380
if (header.fmagic != NMAGIC)
382
= (char *)(TXTRELOC+header.a_text);
385
= (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
387
original_data = header.a_data;
388
header.a_data = data_end - data_begin;
389
header.a_bss = sbrk(0) - core_end;
390
fwrite(&header, sizeof(header), 1, save);
391
filecpy(save, original, header.a_text);
395
for (n = header.a_data, p = data_begin; ; n -= BUFSIZ, p += BUFSIZ)
397
fwrite(p, BUFSIZ, 1, save);
399
fwrite(p, 1, n, save);
404
fseek(original, original_data, 1);
407
filecpy(save, original, header.a_syms+header.a_trsize+header.a_drsize);
408
fread(&stsize, sizeof(stsize), 1, original);
409
fwrite(&stsize, sizeof(stsize), 1, save);
410
filecpy(save, original, stsize - sizeof(stsize));
423
filecpy(save, original, header.a_syms+header.a_trsize+header.a_drsize);
435
check_type_or_pathname_string_symbol_stream(&vs_base[0]);
436
coerce_to_filename(vs_base[0], filename);
444
#ifdef HAVE_GETDTABLESIZE
445
nfile = getdtablesize();
449
for (p = &__iob[3]; p < &__iob[nfile]; p++)
452
memory_save(kcl_self, filename);