home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / lang / lisp / gcl-1.000 / gcl-1 / gcl-1.0 / c / save_sgi4.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-07  |  9.5 KB  |  471 lines

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