143 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* $Header$ */
 | |
| 
 | |
| /*	I/O part of em_code module.
 | |
| 	Also contains C_open, C_close
 | |
| */
 | |
| #include <alloc.h>
 | |
| #include <em_path.h>
 | |
| #include <em_arith.h>
 | |
| #include "insert.h"
 | |
| 
 | |
| int		C_ontmpfile = 0;
 | |
| int		C_sequential = 1;
 | |
| Part		*C_curr_part;
 | |
| Part		*C_stable[TABSIZ];
 | |
| char		*C_tmpdir = TMP_DIR;
 | |
| int		(*C_outpart)(), (*C_swtout)(), (*C_swttmp)();
 | |
| 
 | |
| #ifdef INCORE
 | |
| char		*C_BASE;
 | |
| #endif
 | |
| 
 | |
| File		*C_ofp;
 | |
| 
 | |
| #ifndef INCORE
 | |
| File		*C_tfr, *C_old_ofp;
 | |
| char		*C_tmpfile;
 | |
| char		*strcpy(), *strcat(), *mktemp();
 | |
| char		*C_ibuf = 0;
 | |
| long		C_current_out;
 | |
| #endif
 | |
| 
 | |
| #if BUFSIZ <= 1024 && BIGMACHINE
 | |
| #define BUFFERSIZ	8*BUFSIZ
 | |
| #else
 | |
| #define BUFFERSIZ	BUFSIZ
 | |
| #endif
 | |
| 
 | |
| static char	obuf[BUFFERSIZ];
 | |
| char		*C_top = &obuf[BUFFERSIZ];
 | |
| char		*C_old_top;
 | |
| char		*C_old_opp;
 | |
| #ifdef INCORE
 | |
| char		*C_current_out = obuf;
 | |
| #else
 | |
| char		*C_opp = obuf;
 | |
| #endif
 | |
| 
 | |
| C_flush() {
 | |
| #ifdef INCORE
 | |
| 	static unsigned int bufsiz;
 | |
| 
 | |
| 	if (C_ontmpfile) {
 | |
| 		if (C_BASE == 0) {
 | |
| 			C_BASE = Malloc(BUFFERSIZ);
 | |
| 			bufsiz = BUFFERSIZ;
 | |
| 			C_current_out = C_BASE;
 | |
| 		}
 | |
| 		else {
 | |
| 			C_BASE = Srealloc(C_BASE, (bufsiz << 1));
 | |
| 			C_current_out = C_BASE + bufsiz;
 | |
| 			bufsiz <<= 1;
 | |
| 		}
 | |
| 		C_top = C_BASE + bufsiz;
 | |
| 		return;
 | |
| 	}
 | |
| #endif
 | |
| 	if (C_opp != obuf && sys_write(C_ofp, obuf, C_opp - obuf) == 0) {
 | |
| 		C_failed();
 | |
| 	}
 | |
| 	C_opp = obuf;
 | |
| }
 | |
| 
 | |
| #ifndef INCORE
 | |
| #define Xputbyte(c) if (C_ontmpfile) C_current_out++; put(c)
 | |
| #else
 | |
| #define Xputbyte(c) put(c)
 | |
| #endif
 | |
| 
 | |
| C_putbyte(c)
 | |
| 	int c;
 | |
| {
 | |
| 	Xputbyte(c);
 | |
| }
 | |
| 
 | |
| #define C_putbyte Xputbyte
 | |
| 
 | |
| C_init(w, p)
 | |
| 	arith w, p;
 | |
| {
 | |
| }
 | |
| 
 | |
| C_open(nm)
 | |
| 	char *nm;
 | |
| {
 | |
| 	/*	Open file "nm" for output
 | |
| 	*/
 | |
| 
 | |
| 	if (nm == 0)
 | |
| 		C_ofp = STDOUT;	/* standard output	*/
 | |
| 	else
 | |
| 	if (sys_open(nm, OP_WRITE, &C_ofp) == 0)
 | |
| 		return 0;
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| C_close()
 | |
| {
 | |
| 	/*	Finish the code-generation.
 | |
| 	*/
 | |
| 
 | |
| #ifndef INCORE
 | |
| 	C_flush();
 | |
| 	if (C_tmpfile) {
 | |
| 		(*C_swttmp)();
 | |
| 		sys_close(C_ofp);
 | |
| #else
 | |
| 	if (C_BASE) {
 | |
| #endif
 | |
| 		if (C_curr_part) {
 | |
| 			C_curr_part->p_parts->pp_end = C_current_out - C_BASE;
 | |
| 		}
 | |
| 		(*C_swtout)();
 | |
| 		if (! C_sequential) {
 | |
| 			(*C_outpart)(0);
 | |
| 		}
 | |
| #ifndef INCORE
 | |
| 		sys_close(C_tfr);
 | |
| 		sys_remove(C_tmpfile);
 | |
| 		if (C_ibuf) free(C_ibuf);
 | |
| #else
 | |
| 		free(C_BASE);
 | |
| #endif
 | |
| 	}
 | |
| 	C_flush();
 | |
| 	if (C_ofp != STDOUT)
 | |
| 		sys_close(C_ofp);
 | |
| 	C_ofp = 0;
 | |
| }
 | |
| 
 | |
| C_busy()
 | |
| {
 | |
| 	return C_ofp != 0; /* true if code is being generated */
 | |
| }
 |