hash_t *hash_create(const size_t max, unsigned int (*calc)(const void *, const size_t size), int (*cmp)(const void *, const void *)) { hash_t *h; size_t bits = calc_bits(max); size_t size; bits = (bits < HASH_MIN_BITS)? HASH_MIN_BITS:((bits > HASH_MAX_BITS)? HASH_MAX_BITS:bits); size = primes[bits - HASH_MIN_BITS]; h = (hash_t*)malloc(sizeof(*h) + size * sizeof(list_t)); if (h) { h->entries = (hash_entry_t*)(malloc( max * sizeof(hash_entry_t))); if (!(h->entries)) { free(h); h = NULL; } else { init_list(&(h->spares), h->entries, max); h->calc = calc; h->cmp = cmp; h->size = size; h->num = 0; h->max = max; init_tbl(h->tbl, size); } } return h; }
void main(int argc, char *argv[]) { char *p, buf[20]; cmdname = argv[0]; if (p = getenv("TYPESETTER")) typesetter = p; while (argc > 1 && argv[1][0] == '-') { switch (argv[1][1]) { case 'd': if (argv[1][2] == '\0') { dbg++; printf("...\teqn %s\n", version); } else { lefteq = argv[1][2]; righteq = argv[1][3]; } break; case 's': szstack[0] = gsize = atoi(&argv[1][2]); break; case 'p': deltaps = atoi(&argv[1][2]); dps_set = 1; break; case 'm': minsize = atoi(&argv[1][2]); break; case 'f': strcpy(ftstack[0].name,&argv[1][2]); break; case 'e': noeqn++; break; case 'T': typesetter = &argv[1][2]; break; default: fprintf(stderr, "%s: unknown option %s\n", cmdname, argv[1]); break; } argc--; argv++; } settype(typesetter); sprintf(buf, "\"%s\"", typesetter); install(deftbl, strsave(typesetter), strsave(buf), 0); init_tbl(); /* install other keywords in tables */ curfile = infile; pushsrc(File, curfile->fname); if (argc <= 1) { curfile->fin = stdin; curfile->fname = strsave("-"); getdata(); } else while (argc-- > 1) { if (strcmp(*++argv, "-") == 0) curfile->fin = stdin; else if ((curfile->fin = fopen(*argv, "r")) == NULL) ERROR "can't open file %s", *argv FATAL; curfile->fname = strsave(*argv); getdata(); if (curfile->fin != stdin) fclose(curfile->fin); } exit(0); }
int eqn(int argc,char **argv) { int i, type; setfile(argc,argv); init_tbl(); /* install keywords in tables */ while ((type=getline(&in, &insize)) != EOF) { eqline = linect; if (type == lefteq) do_inline(); else if (*in == '.') { char *p; printf("%s",in); for (p = in + 1; *p == ' ' || *p == '\t'; p++); if (!*p || *p != 'E' || p[1] != 'Q') continue; for (i=11; i<100; used[i++]=0); printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n"); printf(".if \\n(.X .nrf 99 \\n(.s\n"); markline = 0; init(); yyparse(); if (eqnreg>0) { printf(".nr %d \\w'\\*(%d'\n", eqnreg, eqnreg); /* printf(".if \\n(%d>\\n(.l .tm too-long eqn, file %s, between lines %d-%d\n", */ /* eqnreg, svargv[ifile], eqline, linect); */ printf(".nr MK %d\n", markline); /* for -ms macros */ printf(".if %d>\\n(.v .ne %du\n", eqnht, eqnht); printf(".rn %d 10\n", eqnreg); if(!noeqn)printf("\\*(10\n"); } printf(".ps \\n(99\n.ft \\n(98\n"); printf(".EN"); if (lastchar == EOF) { putchar('\n'); break; } if (putchar(lastchar) != '\n') while (putchar(gtc()) != '\n'); } else printf("%s",in); } return(0); }
void hash_clear(hash_t *h) { h->num = 0; init_list(&(h->spares), h->entries, h->max); init_tbl(h->tbl, h->size); }