123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- /* $Id$ */
- /*
- * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
- * See the copyright notice in the ACK home directory, in the file "Copyright".
- */
- /* Change IDentifiers occurring in C programs outside comment, strings
- and character constants.
- -Dname=text : replace all occerences of name by text
- -Dname : same as -Dname=
- -Ffile : read sentences of the from name=text from file
- Author: Erik Baalbergen
- Date: Oct 23, 1985
- */
- #include <stdio.h>
- #ifndef DEF_LENGTH
- #define DEF_LENGTH 8
- #endif
- #define LINE_LEN 1024
- #define HASHSIZE 257
- struct idf {
- struct idf *id_next;
- char *id_name;
- char *id_text;
- };
- struct idf *hash_tab[HASHSIZE];
- char *Malloc(), *Salloc();
- struct idf *FindId();
- extern char *ProgName;
- DoOption(str)
- char *str;
- {
- switch (str[1]) {
- case 'D':
- DoMacro(&str[2]);
- break;
-
- case 'F':
- GetMacros(&str[2]);
- break;
- default:
- fprintf(stderr, "%s: bad option \"%s\"\n", ProgName, str);
- break;
- }
- }
- /*ARGSUSED*/
- CheckId(id, len)
- char *id;
- {
- struct idf *idp = FindId(id);
- if (idp) {
- printf("%s", idp->id_text);
- }
- else {
- printf("%s", id);
- }
- }
- DoMacro(str)
- char *str;
- {
- char *id, *text;
- id = str++;
- while (*str != '\0' && *str != '=') {
- str++;
- }
- if (*str == '=') {
- *str++ = '\0';
- text = str;
- }
- else {
- text = "";
- }
- InsertMacro(id, text);
- }
- GetMacros(fn)
- char *fn;
- {
- FILE *fp;
- register c;
- char buf[LINE_LEN];
- char *bufp = &buf[0];
- if ((fp = fopen(fn, "r")) == NULL) {
- fprintf(stderr, "%s: cannot read file \"%s\"\n", ProgName, fn);
- return;
- }
- while ((c = getc(fp)) != EOF) {
- if (c == '\n' && bufp != &buf[0]) {
- *bufp = '\0';
- DoMacro(&buf[0]);
- bufp = &buf[0];
- }
- else {
- *bufp++ = c;
- }
- }
- fclose(fp);
- }
- InsertMacro(id, text)
- char *id, *text;
- {
- int hash_val = EnHash(id);
- struct idf *idp = hash_tab[hash_val];
- while (idp) {
- if (strcmp(idp->id_name, id) == 0) {
- fprintf(stderr, "%s: (warning) redefinition of %s\n",
- ProgName, id);
- break;
- }
- idp = idp->id_next;
- }
- if (idp == 0) {
- idp = (struct idf *) Malloc(sizeof(struct idf));
- }
- idp->id_next = hash_tab[hash_val];
- idp->id_name = Salloc(id);
- idp->id_text = Salloc(text);
- hash_tab[hash_val] = idp;
- }
- char *
- Malloc(n)
- unsigned n;
- {
- char *mem, *malloc();
- if ((mem = malloc(n)) == 0) {
- fprintf(stderr, "%s: out of memory\n", ProgName);
- exit(1);
- }
- return mem;
- }
- char *
- Salloc(str)
- char *str;
- {
- char *strcpy();
- if (str == 0) {
- str = "";
- }
- return strcpy(Malloc((unsigned)strlen(str) + 1), str);
- }
- struct idf *
- FindId(id)
- char *id;
- {
- register hash_val = EnHash(id);
- register struct idf *idp = hash_tab[hash_val];
- while (idp) {
- if (strcmp(idp->id_name, id) == 0) {
- return idp;
- }
- idp = idp->id_next;
- }
- return 0;
- }
- EnHash(id)
- char *id;
- {
- register unsigned hash_val = 0;
- while (*id) {
- hash_val = 31 * hash_val + *id++;
- }
- return hash_val % (unsigned) HASHSIZE;
- }
- extern int GCcopy;
- BeginOfProgram()
- {
- GCcopy = 1;
- }
- EndOfProgram()
- {
- }
|