246 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			246 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* $Id$ */
 | 
						|
/*
 | 
						|
 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
 | 
						|
 * See the copyright notice in the ACK home directory, in the file "Copyright".
 | 
						|
 */
 | 
						|
/*	mcomm.c -- change ".lcomm name" into ".comm name" where "name"
 | 
						|
	is specified in a list.
 | 
						|
*/
 | 
						|
#include <stdio.h>
 | 
						|
 | 
						|
#define IDFSIZE 4096
 | 
						|
 | 
						|
char *readfile();
 | 
						|
 | 
						|
struct node {
 | 
						|
	char *name;
 | 
						|
	struct node *left, *right;
 | 
						|
};
 | 
						|
 | 
						|
char *
 | 
						|
Malloc(n)
 | 
						|
	unsigned n;
 | 
						|
{
 | 
						|
	char *space;
 | 
						|
	char *malloc();
 | 
						|
 | 
						|
	if ((space = malloc(n)) == 0) {
 | 
						|
		fprintf(stderr, "out of memory\n");
 | 
						|
		exit(1);
 | 
						|
	}
 | 
						|
	return space;
 | 
						|
}
 | 
						|
 | 
						|
struct node *make_tree();
 | 
						|
 | 
						|
#define new_node() ((struct node *) Malloc(sizeof (struct node)))
 | 
						|
 | 
						|
main(argc, argv)
 | 
						|
	char *argv[];
 | 
						|
{
 | 
						|
	char *nl_file, *as_file;
 | 
						|
	char *nl_text, *as_text;
 | 
						|
	struct node *nl_tree = 0;
 | 
						|
	int nl_siz, as_siz;
 | 
						|
 | 
						|
	if (argc != 3) {
 | 
						|
		fprintf(stderr, "use: %s namelist assembler_file\n", argv[0]);
 | 
						|
		exit(1);
 | 
						|
	}
 | 
						|
	nl_file = argv[1];
 | 
						|
	as_file = argv[2];
 | 
						|
 | 
						|
	if ((nl_text = readfile(nl_file, &nl_siz)) == 0) {
 | 
						|
		fprintf(stderr, "%s: cannot read namelist %s\n",
 | 
						|
			argv[0], nl_file);
 | 
						|
		exit(1);
 | 
						|
	}
 | 
						|
 | 
						|
	if ((as_text = readfile(as_file, &as_siz)) == 0) {
 | 
						|
		fprintf(stderr, "%s: cannot read assembler file %s\n",
 | 
						|
			argv[0], as_file);
 | 
						|
		exit(1);
 | 
						|
	}
 | 
						|
 | 
						|
	nl_tree = make_tree(nl_text);
 | 
						|
	edit(as_text, nl_tree);
 | 
						|
 | 
						|
	if (writefile(as_file, as_text, as_siz) == 0) {
 | 
						|
		fprintf(stderr, "%s: cannot write to %s\n", argv[0], as_file);
 | 
						|
		exit(1);
 | 
						|
	}
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
#include <sys/types.h>
 | 
						|
#include <stat.h>
 | 
						|
 | 
						|
char *
 | 
						|
readfile(filename, psiz)
 | 
						|
	char *filename;
 | 
						|
	int *psiz;
 | 
						|
{
 | 
						|
	struct stat stbuf;	/* for `stat' to get filesize		*/
 | 
						|
	register int fd;	/* filedescriptor for `filename'	*/
 | 
						|
	register char *cbuf;	/* pointer to buffer to be returned	*/
 | 
						|
 | 
						|
	if (((fd = open(filename, 0)) < 0) || (fstat(fd, &stbuf) != 0))
 | 
						|
		return 0;
 | 
						|
	cbuf = Malloc(stbuf.st_size + 1);
 | 
						|
	if (read(fd, cbuf, stbuf.st_size) != stbuf.st_size)
 | 
						|
		return 0;
 | 
						|
	cbuf[stbuf.st_size] = '\0';
 | 
						|
	close(fd);		/* filedes no longer needed	*/
 | 
						|
	*psiz = stbuf.st_size;
 | 
						|
	return cbuf;
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
writefile(filename, text, size)
 | 
						|
	char *filename, *text;
 | 
						|
{
 | 
						|
	register fd;
 | 
						|
 | 
						|
	if ((fd = open(filename, 1)) < 0)
 | 
						|
		return 0;
 | 
						|
	if (write(fd, text, size) != size)
 | 
						|
		return 0;
 | 
						|
	close(fd);
 | 
						|
	return 1;
 | 
						|
}
 | 
						|
 | 
						|
struct node *
 | 
						|
make_tree(nl)
 | 
						|
	char *nl;
 | 
						|
{
 | 
						|
	char *id = nl;
 | 
						|
	struct node *tree = 0;
 | 
						|
 | 
						|
	while (*nl) {
 | 
						|
		if (*nl == '\n') {
 | 
						|
			*nl = '\0';
 | 
						|
			insert(&tree, id);
 | 
						|
			id = ++nl;
 | 
						|
		}
 | 
						|
		else {
 | 
						|
			++nl;
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return tree;
 | 
						|
}
 | 
						|
 | 
						|
insert(ptree, id)
 | 
						|
	struct node **ptree;
 | 
						|
	char *id;
 | 
						|
{
 | 
						|
	register cmp;
 | 
						|
 | 
						|
	if (*ptree == 0) {
 | 
						|
		register struct node *nnode = new_node();
 | 
						|
 | 
						|
		nnode->name = id;
 | 
						|
		nnode->left = nnode->right = 0;
 | 
						|
		*ptree = nnode;
 | 
						|
	}
 | 
						|
	else
 | 
						|
	if ((cmp = strcmp((*ptree)->name, id)) < 0)
 | 
						|
		insert(&((*ptree)->right), id);
 | 
						|
	else
 | 
						|
	if (cmp > 0)
 | 
						|
		insert(&((*ptree)->left), id);
 | 
						|
}
 | 
						|
 | 
						|
struct node *
 | 
						|
find(tree, id)
 | 
						|
	struct node *tree;
 | 
						|
	char *id;
 | 
						|
{
 | 
						|
	register cmp;
 | 
						|
 | 
						|
	if (tree == 0)
 | 
						|
		return 0;
 | 
						|
	if ((cmp = strcmp(tree->name, id)) < 0)
 | 
						|
		return find(tree->right, id);
 | 
						|
	if (cmp > 0)
 | 
						|
		return find(tree->left, id);
 | 
						|
	return tree;
 | 
						|
}
 | 
						|
 | 
						|
edit(text, tree)
 | 
						|
	char *text;
 | 
						|
	struct node *tree;
 | 
						|
{
 | 
						|
	register char *ptr = text;
 | 
						|
	char idbuf[IDFSIZE];
 | 
						|
	register char *id;
 | 
						|
	register char *save_ptr;
 | 
						|
 | 
						|
	while (*ptr) {
 | 
						|
		if (
 | 
						|
			*ptr   == '.' &&
 | 
						|
			*++ptr == 'l' &&
 | 
						|
			*++ptr == 'c' &&
 | 
						|
			*++ptr == 'o' &&
 | 
						|
			*++ptr == 'm' &&
 | 
						|
			*++ptr == 'm' &&
 | 
						|
			(*++ptr == ' ' || *ptr == '\t')
 | 
						|
		)
 | 
						|
		{
 | 
						|
			save_ptr = ptr - 6;
 | 
						|
			while (*++ptr == ' ' || *ptr == '\t')
 | 
						|
				;
 | 
						|
			if (*ptr == '_')
 | 
						|
				++ptr;
 | 
						|
			if (InId(*ptr)) {
 | 
						|
				id = &idbuf[0];
 | 
						|
				*id++ = *ptr++;
 | 
						|
				while (InId(*ptr))
 | 
						|
					*id++ = *ptr++;
 | 
						|
				*id = '\0';
 | 
						|
				if (find(tree, idbuf) != 0) {
 | 
						|
					*save_ptr++ = ' ';
 | 
						|
					*save_ptr++ = '.';
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
		while (*ptr && *ptr++ != '\n')
 | 
						|
			;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
InId(c)
 | 
						|
{
 | 
						|
	switch (c) {
 | 
						|
 | 
						|
	case 'a': case 'b': case 'c': case 'd': case 'e':
 | 
						|
	case 'f': case 'g': case 'h': case 'i': case 'j':
 | 
						|
	case 'k': case 'l': case 'm': case 'n': case 'o':
 | 
						|
	case 'p': case 'q': case 'r': case 's': case 't':
 | 
						|
	case 'u': case 'v': case 'w': case 'x': case 'y':
 | 
						|
	case 'z':
 | 
						|
	case 'A': case 'B': case 'C': case 'D': case 'E':
 | 
						|
	case 'F': case 'G': case 'H': case 'I': case 'J':
 | 
						|
	case 'K': case 'L': case 'M': case 'N': case 'O':
 | 
						|
	case 'P': case 'Q': case 'R': case 'S': case 'T':
 | 
						|
	case 'U': case 'V': case 'W': case 'X': case 'Y':
 | 
						|
	case 'Z':
 | 
						|
	case '_':
 | 
						|
	case '.':
 | 
						|
	case '0': case '1': case '2': case '3': case '4':
 | 
						|
	case '5': case '6': case '7': case '8': case '9':
 | 
						|
		return 1;
 | 
						|
	
 | 
						|
	default:
 | 
						|
		return 0;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
puttree(nd)
 | 
						|
	struct node *nd;
 | 
						|
{
 | 
						|
	if (nd) {
 | 
						|
		puttree(nd->left);
 | 
						|
		printf("%s\n", nd->name);
 | 
						|
		puttree(nd->right);
 | 
						|
	}
 | 
						|
}
 |