1 /* $Id: mcomm.c,v 3.2 1994/06/24 12:05:26 ceriel Exp $ */
3 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
4 * See the copyright notice in the ACK home directory, in the file "Copyright".
6 /* mcomm.c -- change ".lcomm name" into ".comm name" where "name"
7 is specified in a list.
17 struct node *left, *right;
27 if ((space = malloc(n)) == 0) {
28 fprintf(stderr, "out of memory\n");
34 struct node *make_tree();
36 #define new_node() ((struct node *) Malloc(sizeof (struct node)))
41 char *nl_file, *as_file;
42 char *nl_text, *as_text;
43 struct node *nl_tree = 0;
47 fprintf(stderr, "use: %s namelist assembler_file\n", argv[0]);
53 if ((nl_text = readfile(nl_file, &nl_siz)) == 0) {
54 fprintf(stderr, "%s: cannot read namelist %s\n",
59 if ((as_text = readfile(as_file, &as_siz)) == 0) {
60 fprintf(stderr, "%s: cannot read assembler file %s\n",
65 nl_tree = make_tree(nl_text);
66 edit(as_text, nl_tree);
68 if (writefile(as_file, as_text, as_siz) == 0) {
69 fprintf(stderr, "%s: cannot write to %s\n", argv[0], as_file);
75 #include <sys/types.h>
79 readfile(filename, psiz)
83 struct stat stbuf; /* for `stat' to get filesize */
84 register int fd; /* filedescriptor for `filename' */
85 register char *cbuf; /* pointer to buffer to be returned */
87 if (((fd = open(filename, 0)) < 0) || (fstat(fd, &stbuf) != 0))
89 cbuf = Malloc(stbuf.st_size + 1);
90 if (read(fd, cbuf, stbuf.st_size) != stbuf.st_size)
92 cbuf[stbuf.st_size] = '\0';
93 close(fd); /* filedes no longer needed */
94 *psiz = stbuf.st_size;
99 writefile(filename, text, size)
100 char *filename, *text;
104 if ((fd = open(filename, 1)) < 0)
106 if (write(fd, text, size) != size)
117 struct node *tree = 0;
139 register struct node *nnode = new_node();
142 nnode->left = nnode->right = 0;
146 if ((cmp = strcmp((*ptree)->name, id)) < 0)
147 insert(&((*ptree)->right), id);
150 insert(&((*ptree)->left), id);
162 if ((cmp = strcmp(tree->name, id)) < 0)
163 return find(tree->right, id);
165 return find(tree->left, id);
173 register char *ptr = text;
176 register char *save_ptr;
186 (*++ptr == ' ' || *ptr == '\t')
190 while (*++ptr == ' ' || *ptr == '\t')
200 if (find(tree, idbuf) != 0) {
206 while (*ptr && *ptr++ != '\n')
215 case 'a': case 'b': case 'c': case 'd': case 'e':
216 case 'f': case 'g': case 'h': case 'i': case 'j':
217 case 'k': case 'l': case 'm': case 'n': case 'o':
218 case 'p': case 'q': case 'r': case 's': case 't':
219 case 'u': case 'v': case 'w': case 'x': case 'y':
221 case 'A': case 'B': case 'C': case 'D': case 'E':
222 case 'F': case 'G': case 'H': case 'I': case 'J':
223 case 'K': case 'L': case 'M': case 'N': case 'O':
224 case 'P': case 'Q': case 'R': case 'S': case 'T':
225 case 'U': case 'V': case 'W': case 'X': case 'Y':
229 case '0': case '1': case '2': case '3': case '4':
230 case '5': case '6': case '7': case '8': case '9':
243 printf("%s\n", nd->name);