115 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <stdio.h>
 | 
						|
#include "em.h"
 | 
						|
 | 
						|
arith cur_pos = 0;
 | 
						|
 | 
						|
dist( lab)
 | 
						|
char *lab;
 | 
						|
 | 
						|
/* Just output a reference which must be filled in on a second pass */
 | 
						|
 | 
						|
{
 | 
						|
	out( "($%s$ - %ld)", lab, cur_pos);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
#define MAX_LABEL	10
 | 
						|
#define	TRUE		1
 | 
						|
#define FALSE		0
 | 
						|
 | 
						|
 | 
						|
struct t_label  {
 | 
						|
			char *lab;
 | 
						|
			arith position;
 | 
						|
		 };
 | 
						|
 | 
						|
struct t_label  label_list[ MAX_LABEL];
 | 
						|
int n_labs = 0;
 | 
						|
 | 
						|
handle_label( lab)
 | 
						|
char *lab;
 | 
						|
 | 
						|
/* Record position of this label */
 | 
						|
 | 
						|
{
 | 
						|
	char *Salloc();
 | 
						|
 | 
						|
	if ( n_labs >= MAX_LABEL)
 | 
						|
		error( "Too many labels!!\n");
 | 
						|
	else {
 | 
						|
		label_list[ n_labs].lab = Salloc( lab, strlen( lab) + 1);
 | 
						|
		label_list[ n_labs++].position = cur_pos;
 | 
						|
	}
 | 
						|
	process_label( lab);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
relocate( f)
 | 
						|
FILE *f;
 | 
						|
 | 
						|
/* Output position-count of the label in file 'f', remove also trailing $ */
 | 
						|
 | 
						|
{
 | 
						|
	char buf[256];
 | 
						|
	int i;
 | 
						|
 | 
						|
	fscanf( f, " %[^$]$", buf);
 | 
						|
	for ( i = 0; i < n_labs; i++)
 | 
						|
		if ( strcmp( buf, label_list[i].lab) == 0) {
 | 
						|
			out( "%ld", label_list[i].position);
 | 
						|
			return;
 | 
						|
		}
 | 
						|
	error( "relocate() : can't find local label %s\n", buf);
 | 
						|
}
 | 
						|
 | 
						|
#include <system.h>
 | 
						|
 | 
						|
File *oldout;
 | 
						|
extern File *outfile;
 | 
						|
 | 
						|
back_patch()
 | 
						|
/* Echo the text on file '.tmp', but replace every occurence of label-
 | 
						|
 *reference's by its position-count. Reference of label 'foo' is '$foo$'.
 | 
						|
 */
 | 
						|
{
 | 
						|
	FILE *save;
 | 
						|
	char c, c1;
 | 
						|
 | 
						|
	sys_close( outfile);
 | 
						|
	outfile = oldout;
 | 
						|
	save = fopen( ".tmp", "r");
 | 
						|
 | 
						|
	while ( ( c = getc( save)) != EOF)
 | 
						|
		if ( c == '$')
 | 
						|
			relocate( save);
 | 
						|
		else if ( c == '/') {		/* skip comments */
 | 
						|
			c = getc( save);
 | 
						|
			out( "/%c", c);
 | 
						|
			if ( c == '*') {
 | 
						|
				c = getc( save);
 | 
						|
				do  {
 | 
						|
					out( "%c", c);
 | 
						|
					c1 = c;
 | 
						|
					c = getc( save);
 | 
						|
				}
 | 
						|
				while ( !( c1 == '*' && c == '/'));
 | 
						|
				out( "%c", c);
 | 
						|
			}
 | 
						|
		}
 | 
						|
		else
 | 
						|
			out( "%c", c);
 | 
						|
	fclose( save);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
save_output()
 | 
						|
{
 | 
						|
	extern arith cur_pos;
 | 
						|
	extern int n_labs;
 | 
						|
 | 
						|
	oldout = outfile;
 | 
						|
	if ( ! sys_open( ".tmp", OP_WRITE, &outfile))
 | 
						|
		fprint( STDERR, "can't open .tmp\n");
 | 
						|
	cur_pos = 0;
 | 
						|
	n_labs = 0;
 | 
						|
}
 |