ftp.nice.ch/pub/next/developer/languages/lisp/AKCL.1.599.s.tar.gz#/akcl-1-599/c/unixsave_sgi.c

This is unixsave_sgi.c in view mode; [Download] [Up]

/* for the 4d */

/*
(c) Copyright Taiichi Yuasa and Masami Hagiya, 1984.  All rights reserved.
Copying of this file is authorized to users who have executed the true and
proper "License Agreement for Kyoto Common LISP" with SIGLISP.
*/

/*
	unixsave.c
*/



/* When MACHINE is S3000, use fcntl.h */
#ifdef ATT
#include <fcntl.h>
#include <unistd.h>
#else
#include <sys/file.h>
#endif


#ifdef BSD
#include <a.out.h>
#endif

#ifdef VAX
#define	PAGSIZ		1024
#define	SEGSIZ		1024
#define	TXTRELOC	0
#endif

#ifdef ISI



#endif

#ifdef SEQ


#endif

#ifdef NEWS
#define	TXTRELOC	0
#endif

#ifdef IBMRT



#endif

#ifdef ATT
#include <filehdr.h>
#include <aouthdr.h>
#include <scnhdr.h>
#include <syms.h>
#define exec		aouthdr
#define a_text		tsize
#define a_data		dsize
#define a_bss		bsize
#endif

#ifdef E15
#include <a.out.h>
extern	etext;
#define exec		bhdr
#define a_text		tsize
#define a_data		dsize
#define a_bss		bsize
#define a_syms		ssize
#define a_trsize	rtsize
#define a_drsize	rdsize
#define	SEGSIZ		(128*1024)
#define	TXTRELOC	(1024*1024)
#endif

#ifndef mips
filecpy(to, from, n)
FILE *to, *from;
register int n;
{
	char buffer[BUFSIZ];

	for (;;)
		if (n > BUFSIZ) {
			fread(buffer, BUFSIZ, 1, from);
			fwrite(buffer, BUFSIZ, 1, to);
			n -= BUFSIZ;
		} else if (n > 0) {
			fread(buffer, 1, n, from);
			fwrite(buffer, 1, n, to);
			break;
		} else
			break;
}
#endif

memory_save(original_file, save_file)
char *original_file, *save_file;
{

#ifdef BSD
	struct exec header;
	int stsize;
#endif
#ifdef ATT
#ifdef mips
	struct {
	  struct filehdr filehdr;
	  struct aouthdr aouthdr;
	  struct scnhdr 
	    text_section,
	    init_section,
	    rdata_section,
	    data_section,
	    lit8_section,
	    lit4_section,
	    sdata_section,
	    sbss_section,
	    bss_section;
	} hdrs;
	struct filehdr *pfilehdr;
	struct aouthdr *paouthdr;
	struct scnhdr *pscnhdr;
	char buf[BUFSIZ];
	HDRR symhdr;
	int fptr, nbytes, pagesize;
#define setbuf(stream,buf)
#else
	struct filehdr fileheader;
	struct exec header;
#endif /* mips */
	int diff;
#endif
#ifdef E15
	struct exec header;
#endif

	char *data_begin, *data_end;
	int original_data;
	FILE *original, *save;
	register int n;
	register char *p;
	extern char *sbrk();
	extern char stdin_buf[BUFSIZ], stdout_buf[BUFSIZ];

	fclose(stdin);
	original = fopen(original_file, "r");
	if (stdin != original || original->_file != 0) {
		fprintf(stderr, "Can't open the original file.\n");
		exit(1);
	}
	setbuf(original, stdin_buf);
	fclose(stdout);
	unlink(save_file);
	n = open(save_file, O_CREAT|O_WRONLY, 0777);
	if (n != 1 || (save = fdopen(n, "w")) != stdout) {
		fprintf(stderr, "Can't open the save file.\n");
		exit(1);
	}
	setbuf(save, stdout_buf);

#ifdef BSD
	fread(&header, sizeof(header), 1, original);

#ifdef VAX
	data_begin
	= (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
#endif
#ifdef SUN
	data_begin
	= (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
#endif
#ifdef SUN2R3
	data_begin = (char *)N_DATADDR(header);
#endif
#ifdef SUN3
	data_begin = (char *)N_DATADDR(header);
#endif
#ifdef NEWS
	data_begin
	= (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
#endif
#ifdef ISI


#endif
#ifdef SEQ


#endif
#ifdef IBMRT


#endif

	data_end = core_end;
	original_data = header.a_data;
	header.a_data = data_end - data_begin;
	header.a_bss = 0;
	fwrite(&header, sizeof(header), 1, save);

#ifdef VAX
	if (header.a_magic == ZMAGIC)
		filecpy(save, original, PAGSIZ - sizeof(header));
	filecpy(save, original, header.a_text);
#endif
#ifdef SUN
	if (header.a_magic == ZMAGIC)
		filecpy(save, original, PAGSIZ - sizeof(header));
	filecpy(save, original, header.a_text);
#endif
#ifdef SUN2R3
	filecpy(save, original, header.a_text - sizeof(header));
#endif
#ifdef SUN3
	filecpy(save, original, header.a_text - sizeof(header));
#endif
#ifdef NEWS
	if (header.a_magic == ZMAGIC)
		filecpy(save, original, PAGSIZ - sizeof(header));
	filecpy(save, original, header.a_text);
#endif
#ifdef ISI




#endif
#ifdef SEQ


#endif
#ifdef IBMRT



#endif
#endif

#ifdef ATT
#ifdef mips
# define NSCNS 4
	read(0, (char*)&hdrs.filehdr, FILHSZ + AOUTHSZ);
	pfilehdr = (struct filehdr*)hdrs.aouthdr.text_start;
	paouthdr = (struct aouthdr*)((long)pfilehdr + FILHSZ);
	pscnhdr  = (struct scnhdr*)((long)paouthdr + AOUTHSZ);

	pagesize = getpagesize();

	hdrs.aouthdr.dsize = 
	  ((long)core_end - hdrs.aouthdr.data_start + pagesize - 1)
	    & ~(pagesize - 1);
	hdrs.aouthdr.bss_start = 
	  hdrs.aouthdr.data_start + hdrs.aouthdr.dsize;
	hdrs.aouthdr.bsize = 0;

	hdrs.filehdr.f_nscns  = NSCNS;
	hdrs.filehdr.f_timdat = time(NULL);
	hdrs.filehdr.f_symptr = hdrs.aouthdr.tsize + hdrs.aouthdr.dsize;

	bcopy((char*)pscnhdr, (char*)&hdrs.text_section, NSCNS * SCNHSZ);
	hdrs.data_section.s_size = hdrs.aouthdr.dsize 
	  - hdrs.rdata_section.s_size;
	bzero((char*)&hdrs.lit8_section,
	      sizeof hdrs - FILHSZ - AOUTHSZ - NSCNS * SCNHSZ);
	fptr = write(1, &hdrs, AOUTHSZ + FILHSZ + pfilehdr->f_nscns * SCNHSZ);

	p = (char*)hdrs.aouthdr.text_start + fptr;
	n = hdrs.aouthdr.tsize - fptr;
	nbytes = pagesize - fptr;
	write(1, p, nbytes);
	p += nbytes;
	n -= nbytes;
	while ( n > pagesize ) {
	  write(1, p, pagesize);
	  p += pagesize;
	  n -= pagesize;
	}
	if ( n )
	  write(1, p, n);

	lseek(1, hdrs.rdata_section.s_scnptr, SEEK_SET);
	p = (char*)hdrs.aouthdr.data_start;
	n = hdrs.aouthdr.dsize;
	while ( n > pagesize ) {
	  write(1, p, pagesize);
	  p += pagesize;
	  n -= pagesize;
	}
	if ( n ) 
	  write(1, p, n);

	lseek(0, pfilehdr->f_symptr, SEEK_SET);
	diff = hdrs.filehdr.f_symptr - pfilehdr->f_symptr;
	read(0, &symhdr, cbHDRR);
#define adjust(field)if(symhdr.cb/**/field/**/Offset)symhdr.cb/**/field/**/Offset+= diff
	adjust(Line);
	adjust(Dn);
	adjust(Pd);
	adjust(Sym);
	adjust(Opt);
	adjust(Aux);
	adjust(Ss);
	adjust(SsExt);
	adjust(Fd);
	adjust(Rfd);
	adjust(Ext);
#undef adjust
	write(1, &symhdr, cbHDRR);
	while ( (n = read(0, buf, sizeof buf)) > 0 )
	  write(1, buf, n);
#else
	fread(&fileheader, sizeof(fileheader), 1, original);
	fread(&header, sizeof(header), 1, original);
	data_begin = (char *)header.data_start;
	data_end = core_end;
	original_data = header.a_data;
	header.a_data = data_end - data_begin;
	diff = header.a_data - original_data;
	header.a_bss = sbrk(0) - core_end;
	fileheader.f_symptr += diff;
	fwrite(&fileheader, sizeof(fileheader), 1, save);
	fwrite(&header, sizeof(header), 1, save);
	fread(&sectionheader, sizeof(sectionheader), 1, original);
	if (sectionheader.s_lnnoptr)
		sectionheader.s_lnnoptr += diff;
	fwrite(&sectionheader, sizeof(sectionheader), 1, save);
	fread(&sectionheader, sizeof(sectionheader), 1, original);
	sectionheader.s_size += diff;
	if (sectionheader.s_lnnoptr)
		sectionheader.s_lnnoptr += diff;
	fwrite(&sectionheader, sizeof(sectionheader), 1, save);
	fread(&sectionheader, sizeof(sectionheader), 1, original);
	sectionheader.s_paddr += diff;
	sectionheader.s_vaddr += diff;
	sectionheader.s_size = header.a_bss;
#ifdef S3000
        if (sectionheader.s_scnptr)
                sectionheader.s_scnptr += diff;
#endif
	if (sectionheader.s_lnnoptr)
		sectionheader.s_lnnoptr += diff;
	fwrite(&sectionheader, sizeof(sectionheader), 1, save);
	for (n = 4;  n <= fileheader.f_nscns;  n++) {
		fread(&sectionheader, sizeof(sectionheader), 1, original);
		if (sectionheader.s_scnptr)
			sectionheader.s_scnptr += diff;
		if (sectionheader.s_lnnoptr)
			sectionheader.s_lnnoptr += diff;
		fwrite(&sectionheader, sizeof(sectionheader), 1, save);
	}
	filecpy(save, original, header.a_text);
#endif /* mips */
#endif 

#ifdef E15
	fread(&header, sizeof(header), 1, original);
	if (header.fmagic != NMAGIC)
		data_begin
		= (char *)(TXTRELOC+header.a_text);
	else
		data_begin
		= (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
	data_end = core_end;
	original_data = header.a_data;
	header.a_data = data_end - data_begin;
	header.a_bss = sbrk(0) - core_end;
	fwrite(&header, sizeof(header), 1, save);
	filecpy(save, original, header.a_text);
#endif

#ifndef mips
	for (n = header.a_data, p = data_begin;  ;  n -= BUFSIZ, p += BUFSIZ)
		if (n > BUFSIZ)
			fwrite(p, BUFSIZ, 1, save);
		else if (n > 0) {
			fwrite(p, 1, n, save);
			break;
		} else
			break;

	fseek(original, original_data, 1);

#ifdef BSD
	filecpy(save, original, header.a_syms+header.a_trsize+header.a_drsize);
	fread(&stsize, sizeof(stsize), 1, original);
	fwrite(&stsize, sizeof(stsize), 1, save);
	filecpy(save, original, stsize - sizeof(stsize));
#endif

#ifdef ATT
	for (;;) {
		n = getc(original);
		if (feof(original))
			break;
		putc(n, save);
	}
#endif

#ifdef E15
	filecpy(save, original, header.a_syms+header.a_trsize+header.a_drsize);
#endif
#endif /* !mips */
	fclose(original);
	fclose(save);
}

Lsave()
{
	char filename[256];

	check_arg(1);
	check_type_or_pathname_string_symbol_stream(&vs_base[0]);
	coerce_to_filename(vs_base[0], filename);
/*
	_cleanup();
*/
	{
		FILE *p;
		int nfile;

#ifdef HAVE_GETDTABLESIZE
		nfile = getdtablesize();
#else
		nfile = _NFILE;
#endif
		for (p = &_iob[3];  p < &_iob[nfile];  p++)
			fclose(p);
	}
	memory_save(kcl_self, filename);
/*
	_exit(0);
*/
	exit(0);
	/*  no return  */
}


#ifdef ISI










#endif

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.