# include # include # include # include # include # include # include "globs.h" # include SCCSID(@(#)usubr.c 8.1 12/31/84) /* ** usubr.c ** ** utility routines to handle setting up params, etc for DBU calls */ /* * generate domain names, formats */ domnam(lnp, pre) QTREE **lnp; char *pre; { register char suf, *n; char name[MAXNAME]; char *getformat(); register QTREE **p; suf = '1'; for (n=name; *n++= *pre++;); *n = '\0'; n--; for (p = lnp; *p != NULL; p++) { *n = suf++; setp(PV_STR, name); setp(PV_STR, getformat(*p)); } } /* ** gets format in ascii from RESDOM or AOP node */ static char * getformat(p) QTREE *p; { static char buf[10]; register char *b; b = buf; *b++ = p->sym.value.sym_op.opfrmt; itoa(p->sym.value.sym_op.opfrml & I1MASK, b); return(buf); } /* ** makes list of nodes (depth first) */ lnode(nod, lnodv, count) QTREE *nod, *lnodv[]; int count; { register QTREE *q; register int i; i = count; q = nod; if (q && q->sym.type != TREE) { i = lnode(q->left, lnodv, i); lnodv[i++] = q; } return(i); } /* ** Immediately destroys the relation if it is an _SYS */ dstr_rel(relnum) int relnum; { initp(); if (dstr_mark(relnum)) call_dbu(mdDESTROY, FALSE); else resetp(); } /* ** Put relation on list of relations to be ** destroyed. A call to initp() must be ** made before any calls to dstr_mark(). ** ** A call to call_dbu will actually have ** the relations exterminated ** ** Trace Flags: ** 65 */ dstr_mark(relnum) int relnum; { register char *p; char *rnum_convert(); bool dstr_flag; dstr_flag = FALSE; if (rnum_temp(relnum)) { p = rnum_convert(relnum); # ifdef xDTR1 if (tTf(65, 4)) printf("destroying %s\n", p); # endif setp(PV_STR, p); specclose(relnum); /* guarantee that relation is closed and descriptor destroyed */ rnum_remove(relnum); dstr_flag = TRUE; /* indicate that there are relations to be destroyed */ } return(dstr_flag); } /* ** Make a temporary relation to match ** the target list of tree. ** ** If rnum is positive, use it as the relation number, ** Otherwise allocate a new one. */ mak_t_rel(tree, prefix, rnum) QTREE *tree; char *prefix; int rnum; { QTREE *lnodv[MAXDOM + 1]; register int relnum; initp(); setp(PV_STR, "0"); /* initial relstat field */ relnum = rnum < 0 ? rnum_alloc() : rnum; setp(PV_STR, rnum_convert(relnum)); lnodv[lnode(tree->left, lnodv, 0)] = NULL; domnam(lnodv, prefix); call_dbu(mdCREATE, FALSE); return (relnum); } QTREE ** mksqlist(tree, var) QTREE *tree; int var; { register QTREE **sq; register int i; static QTREE *sqlist[MAXRANGE]; sq = sqlist; for (i = 0; i < MAXRANGE; i++) *sq++ = 0; sqlist[var] = tree; return (sqlist); } long rel_pages(tupcnt, width) long tupcnt; int width; { register int tups_p_page; tups_p_page = (PGSIZE - 12) / (width + 2); return ((tupcnt + tups_p_page - 1) / tups_p_page); }