130 lines
1.9 KiB
C
130 lines
1.9 KiB
C
|
/* Print IDentifiers occurring in C programs outside comment, strings
|
||
|
and character constants.
|
||
|
Flags:
|
||
|
-l<num> : print identifiers of <num> or more characters
|
||
|
(default <num> = 8)
|
||
|
|
||
|
Author: Erik Baalbergen
|
||
|
Date: Oct 23, 1985
|
||
|
*/
|
||
|
|
||
|
#include <stdio.h>
|
||
|
|
||
|
extern char *ProgName;
|
||
|
|
||
|
#ifndef DEF_LENGTH
|
||
|
#define DEF_LENGTH 8
|
||
|
#endif
|
||
|
|
||
|
int maxlen = DEF_LENGTH;
|
||
|
|
||
|
BeginOfProgram() {}
|
||
|
|
||
|
DoOption(str)
|
||
|
char *str;
|
||
|
{
|
||
|
switch (str[1]) {
|
||
|
|
||
|
case 'l':
|
||
|
if ((maxlen = atoi(&str[2])) <= 0) {
|
||
|
fprintf(stderr, "%s: option \"-l%s\" ignored\n",
|
||
|
ProgName, &str[2]);
|
||
|
maxlen = DEF_LENGTH;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
fprintf(stderr, "%s: bad option \"%s\"\n", ProgName, str);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CheckId(id, len)
|
||
|
char *id;
|
||
|
{
|
||
|
if (len >= maxlen) {
|
||
|
InsertId(id);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#define HASHSIZE 257
|
||
|
|
||
|
struct idf {
|
||
|
char *id_name;
|
||
|
struct idf *id_next;
|
||
|
};
|
||
|
|
||
|
struct idf *hash_tab[HASHSIZE];
|
||
|
|
||
|
char *Malloc(), *Salloc();
|
||
|
|
||
|
InsertId(id)
|
||
|
char *id;
|
||
|
{
|
||
|
int hash_val = EnHash(id);
|
||
|
register struct idf *idp = hash_tab[hash_val];
|
||
|
register struct idf *p = 0;
|
||
|
|
||
|
while (idp && strcmp(idp->id_name, id)) {
|
||
|
p = idp;
|
||
|
idp = idp->id_next;
|
||
|
}
|
||
|
|
||
|
if (idp == 0) {
|
||
|
idp = (struct idf *) Malloc(sizeof(struct idf));
|
||
|
idp->id_next = 0;
|
||
|
if (!p) hash_tab[hash_val] = idp;
|
||
|
else p->id_next = idp;
|
||
|
idp->id_name = Salloc(id);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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(strlen(str) + 1), str);
|
||
|
}
|
||
|
|
||
|
EnHash(id)
|
||
|
char *id;
|
||
|
{
|
||
|
register unsigned hash_val = 0;
|
||
|
register n = maxlen;
|
||
|
|
||
|
while (n-- && *id)
|
||
|
hash_val = 31 * hash_val + *id++;
|
||
|
|
||
|
return hash_val % (unsigned) HASHSIZE;
|
||
|
}
|
||
|
|
||
|
EndOfProgram()
|
||
|
{
|
||
|
register struct idf *idp;
|
||
|
register int i;
|
||
|
|
||
|
for (i = 0; i < HASHSIZE; i++) {
|
||
|
for (idp = hash_tab[i]; idp; idp = idp->id_next) {
|
||
|
printf("%s\n", idp->id_name);
|
||
|
}
|
||
|
}
|
||
|
}
|