~ubuntu-branches/ubuntu/quantal/gclcvs/quantal

« back to all changes in this revision

Viewing changes to o/save_sgi4.c

  • Committer: Bazaar Package Importer
  • Author(s): Camm Maguire
  • Date: 2004-06-24 15:13:46 UTC
  • Revision ID: james.westby@ubuntu.com-20040624151346-xh0xaaktyyp7aorc
Tags: 2.7.0-26
C_GC_OFFSET is 2 on m68k-linux

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* for the 4d */
 
2
 
 
3
/*
 
4
 Copyright (C) 1994 M. Hagiya, W. Schelter, T. Yuasa
 
5
 
 
6
This file is part of GNU Common Lisp, herein referred to as GCL
 
7
 
 
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)
 
11
any later version.
 
12
 
 
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.
 
17
 
 
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.
 
21
 
 
22
*/
 
23
 
 
24
/*
 
25
        unixsave.c
 
26
*/
 
27
 
 
28
 
 
29
 
 
30
/* When MACHINE is S3000, use fcntl.h */
 
31
#ifdef ATT
 
32
#include <fcntl.h>
 
33
#include <unistd.h>
 
34
#else
 
35
#include <sys/file.h>
 
36
#endif
 
37
 
 
38
 
 
39
#ifdef BSD
 
40
#include <a.out.h>
 
41
#endif
 
42
 
 
43
#ifdef VAX
 
44
#define PAGSIZ          1024
 
45
#define SEGSIZ          1024
 
46
#define TXTRELOC        0
 
47
#endif
 
48
 
 
49
#ifdef ISI
 
50
 
 
51
 
 
52
 
 
53
#endif
 
54
 
 
55
#ifdef SEQ
 
56
 
 
57
 
 
58
#endif
 
59
 
 
60
#ifdef NEWS
 
61
#define TXTRELOC        0
 
62
#endif
 
63
 
 
64
#ifdef IBMRT
 
65
 
 
66
 
 
67
 
 
68
#endif
 
69
 
 
70
#ifdef ATT
 
71
#include <filehdr.h>
 
72
#include <aouthdr.h>
 
73
#include <scnhdr.h>
 
74
#include <syms.h>
 
75
#define exec            aouthdr
 
76
#define a_text          tsize
 
77
#define a_data          dsize
 
78
#define a_bss           bsize
 
79
#endif
 
80
 
 
81
#ifdef E15
 
82
#include <a.out.h>
 
83
extern  etext;
 
84
#define exec            bhdr
 
85
#define a_text          tsize
 
86
#define a_data          dsize
 
87
#define a_bss           bsize
 
88
#define a_syms          ssize
 
89
#define a_trsize        rtsize
 
90
#define a_drsize        rdsize
 
91
#define SEGSIZ          (128*1024)
 
92
#define TXTRELOC        (1024*1024)
 
93
#endif
 
94
 
 
95
#ifndef mips
 
96
filecpy(to, from, n)
 
97
FILE *to, *from;
 
98
register int n;
 
99
{
 
100
        char buffer[BUFSIZ];
 
101
 
 
102
        for (;;)
 
103
                if (n > BUFSIZ) {
 
104
                        fread(buffer, BUFSIZ, 1, from);
 
105
                        fwrite(buffer, BUFSIZ, 1, to);
 
106
                        n -= BUFSIZ;
 
107
                } else if (n > 0) {
 
108
                        fread(buffer, 1, n, from);
 
109
                        fwrite(buffer, 1, n, to);
 
110
                        break;
 
111
                } else
 
112
                        break;
 
113
}
 
114
#endif
 
115
 
 
116
memory_save(original_file, save_file)
 
117
char *original_file, *save_file;
 
118
{
 
119
 
 
120
#ifdef BSD
 
121
        struct exec header;
 
122
        int stsize;
 
123
#endif
 
124
#ifdef ATT
 
125
#ifdef mips
 
126
        struct {
 
127
          struct filehdr filehdr;
 
128
          struct aouthdr aouthdr;
 
129
          struct scnhdr 
 
130
            text_section,
 
131
            init_section,
 
132
            rdata_section,
 
133
            data_section,
 
134
            lit8_section,
 
135
            lit4_section,
 
136
            sdata_section,
 
137
            sbss_section,
 
138
            bss_section;
 
139
        } hdrs;
 
140
        struct filehdr *pfilehdr;
 
141
        struct aouthdr *paouthdr;
 
142
        struct scnhdr *pscnhdr;
 
143
        char buf[BUFSIZ];
 
144
        HDRR symhdr;
 
145
        int fptr, nbytes, pagesize;
 
146
#define setbuf(stream,buf)
 
147
#else
 
148
        struct filehdr fileheader;
 
149
        struct exec header;
 
150
#endif /* mips */
 
151
        int diff;
 
152
#endif
 
153
#ifdef E15
 
154
        struct exec header;
 
155
#endif
 
156
 
 
157
        char *data_begin, *data_end;
 
158
        int original_data;
 
159
        FILE *original, *save;
 
160
        register int n;
 
161
        register char *p;
 
162
        extern void *sbrk();
 
163
 
 
164
        fclose(stdin);
 
165
        original = fopen(original_file, "r");
 
166
        if (stdin != original || original->_file != 0) {
 
167
                fprintf(stderr, "Can't open the original file.\n");
 
168
                exit(1);
 
169
        }
 
170
        setbuf(original, stdin_buf);
 
171
        fclose(stdout);
 
172
        unlink(save_file);
 
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");
 
176
                exit(1);
 
177
        }
 
178
        setbuf(save, stdout_buf);
 
179
 
 
180
#ifdef BSD
 
181
        fread(&header, sizeof(header), 1, original);
 
182
 
 
183
#ifdef VAX
 
184
        data_begin
 
185
        = (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
 
186
#endif
 
187
#ifdef SUN
 
188
        data_begin
 
189
        = (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
 
190
#endif
 
191
#ifdef SUN2R3
 
192
        data_begin = (char *)N_DATADDR(header);
 
193
#endif
 
194
#ifdef SUN3
 
195
        data_begin = (char *)N_DATADDR(header);
 
196
#endif
 
197
#ifdef NEWS
 
198
        data_begin
 
199
        = (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
 
200
#endif
 
201
#ifdef ISI
 
202
 
 
203
 
 
204
#endif
 
205
#ifdef SEQ
 
206
 
 
207
 
 
208
#endif
 
209
#ifdef IBMRT
 
210
 
 
211
 
 
212
#endif
 
213
 
 
214
        data_end = core_end;
 
215
        original_data = header.a_data;
 
216
        header.a_data = data_end - data_begin;
 
217
        header.a_bss = 0;
 
218
        fwrite(&header, sizeof(header), 1, save);
 
219
 
 
220
#ifdef VAX
 
221
        if (header.a_magic == ZMAGIC)
 
222
                filecpy(save, original, PAGSIZ - sizeof(header));
 
223
        filecpy(save, original, header.a_text);
 
224
#endif
 
225
#ifdef SUN
 
226
        if (header.a_magic == ZMAGIC)
 
227
                filecpy(save, original, PAGSIZ - sizeof(header));
 
228
        filecpy(save, original, header.a_text);
 
229
#endif
 
230
#ifdef SUN2R3
 
231
        filecpy(save, original, header.a_text - sizeof(header));
 
232
#endif
 
233
#ifdef SUN3
 
234
        filecpy(save, original, header.a_text - sizeof(header));
 
235
#endif
 
236
#ifdef NEWS
 
237
        if (header.a_magic == ZMAGIC)
 
238
                filecpy(save, original, PAGSIZ - sizeof(header));
 
239
        filecpy(save, original, header.a_text);
 
240
#endif
 
241
#ifdef ISI
 
242
 
 
243
 
 
244
 
 
245
 
 
246
#endif
 
247
#ifdef SEQ
 
248
 
 
249
 
 
250
#endif
 
251
#ifdef IBMRT
 
252
 
 
253
 
 
254
 
 
255
#endif
 
256
#endif
 
257
 
 
258
#ifdef ATT
 
259
#ifdef mips
 
260
# define NSCNS 4
 
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);
 
265
 
 
266
        pagesize = getpagesize();
 
267
 
 
268
        hdrs.aouthdr.dsize = 
 
269
          ((long)core_end - hdrs.aouthdr.data_start + pagesize - 1)
 
270
            & ~(pagesize - 1);
 
271
        hdrs.aouthdr.bss_start = 
 
272
          hdrs.aouthdr.data_start + hdrs.aouthdr.dsize;
 
273
        hdrs.aouthdr.bsize = 0;
 
274
 
 
275
        hdrs.filehdr.f_nscns  = NSCNS;
 
276
        hdrs.filehdr.f_timdat = time(NULL);
 
277
        hdrs.filehdr.f_symptr = hdrs.aouthdr.tsize + hdrs.aouthdr.dsize;
 
278
 
 
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);
 
285
 
 
286
        p = (char*)hdrs.aouthdr.text_start + fptr;
 
287
        n = hdrs.aouthdr.tsize - fptr;
 
288
        nbytes = pagesize - fptr;
 
289
        write(1, p, nbytes);
 
290
        p += nbytes;
 
291
        n -= nbytes;
 
292
        while ( n > pagesize ) {
 
293
          write(1, p, pagesize);
 
294
          p += pagesize;
 
295
          n -= pagesize;
 
296
        }
 
297
        if ( n )
 
298
          write(1, p, n);
 
299
 
 
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);
 
305
          p += pagesize;
 
306
          n -= pagesize;
 
307
        }
 
308
        if ( n ) 
 
309
          write(1, p, n);
 
310
 
 
311
        lseek(0, pfilehdr->f_symptr, SEEK_SET);
 
312
        diff = hdrs.filehdr.f_symptr - pfilehdr->f_symptr;
 
313
        read(0, &symhdr, cbHDRR);
 
314
#ifndef __STDC__
 
315
#define adjust(field)if(symhdr.cb/**/field/**/Offset)symhdr.cb/**/field/**/Offset+= diff
 
316
#else
 
317
#define adjust(field)if(symhdr.cb##field##Offset)symhdr.cb##field##Offset+= diff
 
318
#endif
 
319
        adjust(Line);
 
320
        adjust(Dn);
 
321
        adjust(Pd);
 
322
        adjust(Sym);
 
323
        adjust(Opt);
 
324
        adjust(Aux);
 
325
        adjust(Ss);
 
326
        adjust(SsExt);
 
327
        adjust(Fd);
 
328
        adjust(Rfd);
 
329
        adjust(Ext);
 
330
#undef adjust
 
331
        write(1, &symhdr, cbHDRR);
 
332
        while ( (n = read(0, buf, sizeof buf)) > 0 )
 
333
          write(1, buf, n);
 
334
#else
 
335
        fread(&fileheader, sizeof(fileheader), 1, original);
 
336
        fread(&header, sizeof(header), 1, original);
 
337
        data_begin = (char *)header.data_start;
 
338
        data_end = core_end;
 
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(&sectionheader, sizeof(sectionheader), 1, original);
 
347
        if (sectionheader.s_lnnoptr)
 
348
                sectionheader.s_lnnoptr += diff;
 
349
        fwrite(&sectionheader, sizeof(sectionheader), 1, save);
 
350
        fread(&sectionheader, sizeof(sectionheader), 1, original);
 
351
        sectionheader.s_size += diff;
 
352
        if (sectionheader.s_lnnoptr)
 
353
                sectionheader.s_lnnoptr += diff;
 
354
        fwrite(&sectionheader, sizeof(sectionheader), 1, save);
 
355
        fread(&sectionheader, sizeof(sectionheader), 1, original);
 
356
        sectionheader.s_paddr += diff;
 
357
        sectionheader.s_vaddr += diff;
 
358
        sectionheader.s_size = header.a_bss;
 
359
#ifdef S3000
 
360
        if (sectionheader.s_scnptr)
 
361
                sectionheader.s_scnptr += diff;
 
362
#endif
 
363
        if (sectionheader.s_lnnoptr)
 
364
                sectionheader.s_lnnoptr += diff;
 
365
        fwrite(&sectionheader, sizeof(sectionheader), 1, save);
 
366
        for (n = 4;  n <= fileheader.f_nscns;  n++) {
 
367
                fread(&sectionheader, 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(&sectionheader, sizeof(sectionheader), 1, save);
 
373
        }
 
374
        filecpy(save, original, header.a_text);
 
375
#endif /* mips */
 
376
#endif 
 
377
 
 
378
#ifdef E15
 
379
        fread(&header, sizeof(header), 1, original);
 
380
        if (header.fmagic != NMAGIC)
 
381
                data_begin
 
382
                = (char *)(TXTRELOC+header.a_text);
 
383
        else
 
384
                data_begin
 
385
                = (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
 
386
        data_end = core_end;
 
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);
 
392
#endif
 
393
 
 
394
#ifndef mips
 
395
        for (n = header.a_data, p = data_begin;  ;  n -= BUFSIZ, p += BUFSIZ)
 
396
                if (n > BUFSIZ)
 
397
                        fwrite(p, BUFSIZ, 1, save);
 
398
                else if (n > 0) {
 
399
                        fwrite(p, 1, n, save);
 
400
                        break;
 
401
                } else
 
402
                        break;
 
403
 
 
404
        fseek(original, original_data, 1);
 
405
 
 
406
#ifdef BSD
 
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));
 
411
#endif
 
412
 
 
413
#ifdef ATT
 
414
        for (;;) {
 
415
                n = getc(original);
 
416
                if (feof(original))
 
417
                        break;
 
418
                putc(n, save);
 
419
        }
 
420
#endif
 
421
 
 
422
#ifdef E15
 
423
        filecpy(save, original, header.a_syms+header.a_trsize+header.a_drsize);
 
424
#endif
 
425
#endif /* !mips */
 
426
        fclose(original);
 
427
        fclose(save);
 
428
}
 
429
 
 
430
Lsave()
 
431
{
 
432
        char filename[256];
 
433
 
 
434
        check_arg(1);
 
435
        check_type_or_pathname_string_symbol_stream(&vs_base[0]);
 
436
        coerce_to_filename(vs_base[0], filename);
 
437
/*
 
438
        _cleanup();
 
439
*/
 
440
        {
 
441
                FILE *p;
 
442
                int nfile;
 
443
 
 
444
#ifdef HAVE_GETDTABLESIZE
 
445
                nfile = getdtablesize();
 
446
#else
 
447
                nfile = _NFILE;
 
448
#endif
 
449
                for (p = &__iob[3];  p < &__iob[nfile];  p++)
 
450
                        fclose(p);
 
451
        }
 
452
        memory_save(kcl_self, filename);
 
453
/*
 
454
        _exit(0);
 
455
*/
 
456
        exit(0);
 
457
        /*  no return  */
 
458
}
 
459
 
 
460
 
 
461
#ifdef ISI
 
462
 
 
463
 
 
464
 
 
465
 
 
466
 
 
467
 
 
468
 
 
469
 
 
470
 
 
471
 
 
472
#endif