FreeCalypso > hg > ueda-linux
diff ueda/libuschem/graphsym.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/graphsym.c Mon Jul 20 00:24:37 2015 +0000 @@ -0,0 +1,125 @@ +/* + * Functions for working with graphical symbols + */ + +#include <sys/types.h> +#include <stdio.h> +#include <ctype.h> +#include <strings.h> +#include "schemstruct.h" +#include "graphsym.h" + +extern char *malloc(); +extern char *copystr(); + +extern FILE *find_symlib_file(); +extern char sought_libfile_fullpath[]; + +#define HASH_SIZE 1103 + +static struct graphsym *graphsym_hash[HASH_SIZE]; +int total_graphsyms; + +static int +hash_graphsym_name(str) + char *str; +{ + register u_long accum = 0; + register char *cp; + register int c, i; + + for (cp = str, i = 1; c = *cp; cp++, i++) + accum += c * i; + return(accum % HASH_SIZE); +} + +struct graphsym * +fetch_graphsym(symname) + char *symname; +{ + register struct graphsym *gs, **gsp; + FILE *f; + + for (gsp = graphsym_hash + hash_graphsym_name(symname); gs = *gsp; + gsp = &gs->gs_nextinhash) + if (!strcmp(gs->gs_name, symname)) + return(gs); + + gs = (struct graphsym *) malloc(sizeof(struct graphsym)); + bzero(gs, sizeof(struct graphsym)); + gs->gs_name = symname; + f = find_symlib_file(symname, ".sym"); + if (!f) { + fprintf(stderr, "Cannot locate graphical symbol \"%s\"\n", + symname); + exit(1); + } + gs->gs_pathname = copystr(sought_libfile_fullpath); + read_symbol_file(gs, f); + fclose(f); + + *gsp = gs; + total_graphsyms++; + return(gs); +} + +load_graphsyms(schem) + struct schem *schem; +{ + register struct schemobj *obj; + + for (obj = schem->obj_next; obj != (struct schemobj *)schem; + obj = obj->obj_next) + switch (obj->obj_type) { + case OBJTYPE_COMPINST: + if (!obj->compobj_isgraph) + continue; + /* FALL THRU */ + case OBJTYPE_GRAPHSYM: + obj->compobj_graphsym = + fetch_graphsym(obj->compobj_graph_symname); + load_decor_graphsyms(obj); + break; + } +} + +load_decor_graphsyms(obj) + struct schemobj *obj; +{ + register struct decoration *decor; + + for (decor = obj->obj_decorations; decor; decor = decor->decor_next) { + if (decor->decor_type != DECOR_TYPE_SYMONPIN) + continue; + decor->decorpinsym_gs = + fetch_graphsym(decor->decorpinsym_symname); + } +} + +graphsym_forall(callback) + int (*callback)(); +{ + register struct graphsym *gs, **hb; + register int i; + + for (hb = graphsym_hash, i = 0; i < HASH_SIZE; hb++, i++) + for (gs = *hb; gs; gs = gs->gs_nextinhash) + callback(gs); +} + +report_graphsym_hash_quality() +{ + register struct graphsym *gs, **hb; + register int i, curchain; + int maxchain = 0; + + for (hb = graphsym_hash, i = 0; i < HASH_SIZE; hb++, i++) { + curchain = 0; + for (gs = *hb; gs; gs = gs->gs_nextinhash) + curchain++; + if (curchain > maxchain) + maxchain = curchain; + } + printf("%d graphsyms total, longest hash chain is %d\n", + total_graphsyms, maxchain); +}