#ifndef lint static char sccsid[] = "@(#)add_oper.c 9.2 88/01/19 Copyright 1987 Sun Micro"; #endif /*- * Add operator to current PostScript dictionary * add_operator, Tues Apr 9 1985 * * James Gosling, * Sun Microsystems */ #ifdef REF #include #include #endif #include "PostScript.h" struct body *get_name(); struct object define_operator_name, define_operator_obj; add_operator(name, loc, dict) char *name, *loc; struct body *dict; { struct operator_def *d = (struct operator_def *) snoopalloc("add_oper.c", sizeof(struct operator_def)); d->index = 0; d->pname = name; d->args_used = 0; d->growth = 0; /* results - args */ d->function = (int (*) ()) loc; set_body_of(&define_operator_name, get_name(d->pname, strlen(d->pname))); define_operator_obj.value.def = d; define_object_in_dictionary(define_operator_name, define_operator_obj, dict, 0); } struct body * get_name(name, len) register char *name; { register hash = 0, n; register struct body *p; if (len < 0) { register char *p = name; while (*p++); len = (p - name - 1); } n = len; while (--n >= 0) hash = (hash << 5) - hash + *name++; name -= len; p = hash_table[(hash & 0x7fffffff) % hash_table_size]; while (p && (p->body.keyword.hash != hash || p->body.keyword.namelen != len || strncmp(name, p->body.keyword.name, len) != 0)) p = p->body.keyword.same_bucket; if (p == 0) p = new_name(hash, name, len); return p; }