FreeCalypso > hg > ueda-linux
diff ueda/libuschem/compinst.c @ 0:cd92449fdb51
initial import of ueda and ifctf-part-lib from ifctfvax CVS
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Mon, 20 Jul 2015 00:24:37 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ueda/libuschem/compinst.c Mon Jul 20 00:24:37 2015 +0000 @@ -0,0 +1,102 @@ +/* + * Component instance hash table logic + */ + +#include <sys/types.h> +#include <stdio.h> +#include <strings.h> +#include "schemstruct.h" + +extern char *malloc(); + +#define HASH_SIZE 1103 + +static int +hash_instname(str) + char *str; +{ + register u_long accum; + register char *cp; + register int c; + + for (cp = str, accum = 0; c = *cp; cp++) { + accum <<= 4; + accum |= c & 0x0F; + } + return(accum % HASH_SIZE); +} + +hash_component_instances(schem) + struct schem *schem; +{ + struct schemobj **hashtab; + register struct schemobj *obj, *hc, **hcp; + int errflag = 0, errstat = 0; + + hashtab = (struct schemobj **) + malloc(sizeof(struct schemobj *) * HASH_SIZE); + if (!hashtab) { + perror("malloc"); + exit(1); + } + bzero(hashtab, sizeof(struct schemobj *) * HASH_SIZE); + + for (obj = schem->obj_next; obj != (struct schemobj *)schem; + obj = obj->obj_next) { + if (obj->obj_type != OBJTYPE_COMPINST) + continue; + hcp = hashtab + hash_instname(obj->compobj_instname); + for (; hc = *hcp; hcp = &hc->compobj_nextinhash) + if (!strcmp(obj->compobj_instname, hc->compobj_instname)) { + fprintf(stderr, + "%s: %s: duplicate component instance name (line %d, line %d)\n", + schem->orig_filename, obj->compobj_instname, + hc->obj_lineno, obj->obj_lineno); + errflag = 1; + break; + } + if (errflag) { + errflag = 0; + errstat = -1; + } else + *hcp = obj; + } + schem->compinst_hash = hashtab; + return(errstat); +} + +report_compinst_hash_quality(schem) + struct schem *schem; +{ + struct schemobj **hashtab; + int maxchain, total; + register int hb, curchain; + register struct schemobj *obj; + + hashtab = schem->compinst_hash; + for (hb = 0, total = maxchain = 0; hb < HASH_SIZE; hb++) { + for (obj = hashtab[hb], curchain = 0; obj; + obj = obj->compobj_nextinhash) { + curchain++; + total++; + } + if (curchain > maxchain) + maxchain = curchain; + } + printf("%s: %d component instances total, longest hash chain is %d\n", + schem->orig_filename, total, maxchain); +} + +struct schemobj * +find_component_instance(schem, instname) + struct schem *schem; + register char *instname; +{ + register struct schemobj *obj; + + for (obj = schem->compinst_hash[hash_instname(instname)]; obj; + obj = obj->compobj_nextinhash) + if (!strcmp(obj->compobj_instname, instname)) + return(obj); + return(NULL); +}