#include "defs.h" LOC DL merge(); DL join(h) DL h; { REG DL n; DL1 p1; DL r=h; chkhd(h, "wc"); while(cursor(p1)==SP) { if(n=findhead(r->type,p1)) r=merge(n, r); else error("not found"); } return(r); } /* * Mark comma separated string. * * acp = string -- the first comma in the string is replaced by a null * return = pointer to the string following the comma * return zero if no comma. */ STRING commasep(acp) STRING acp; { REG CHAR *cp, c; for(cp = acp; c = *cp; cp++) if(c == ','){ *cp++ = 0; return(*cp?cp:0); } return(0); } /* * return addr of chip type name * * h is addr of chip header * return zero if no type name */ STRING ctype(h) REG DL h; { REG STRING cp; cp = dln(h)->name; /* ignore chip name */ while(*cp++); if (*cp == 0) return(nil(STRING)); return(cp); } /* * see if name exists already * * s points to string * h is zero or points to entry to ignore * return pointer to entry with that name * return 0 if not. */ DL exists(s, h) REG STRING s; REG DL h; { REG DL p; p = dstart; while(p = nexta('Z',p)) switch(p->type){ case 'L': case 'w': case 'c': case 'J': if (p != h && equstr(s, dln(p)->name)) return(p); } return(nil(DL)); } VOID fixname(h, np, tp) DL h; STRING np, tp; { chkhd(h, "wcL"); newdln(AFTER, h, h->type, h->flag, np, (tp ? tp : "")); delete(h); } /* * move all entries from one item into another */ LOC DL merge(src, dst) REG DL src; DL dst; { INT L; DL nxt; if(src!=dst) { openfd=maketmp(2); if(openfd<0) error("cannot create tmp"); nxt=succ(src->type, src); L=adr(nxt)-adr(src); chkwt(openfd, adr(src), L); moveup(src, L); if(dst>src) /* above */ dst = dl(adr(dst)-L); nxt=succa(dst); movedown(nxt, L); Lseek(openfd, 0L, 0); chkrd(openfd, adr(nxt), L); delete(nxt); fileclose(); } return(dst); } /* * Change the name and type of an item. * * h = item header * k is 'N' or 'n' */ DL newname(h, k, np) REG DL h; CHAR k; REG STRING np; { DL q; REG STRING tp; chkhd(h, "cwL"); if(np[0] == 0) { np = noname(); tp = 0; } else{ tp = commasep(np); if(np[0] == 0) np = dln(h)->name; if(chkid(np)) error("bad name"); } if (q=exists(np, h)) { if(q->type!=h->type)k='n'; /* force error */ switch(k){ case 'N': h=merge(h, q); break; case 'n': error("name already exists"); default: return(0); } } if(h->type!='L') { if (tp == 0) tp = ctype(h); } else{ tp=0; } fixname(h, np, tp); return(h); } /* * generate default chip name */ STRING noname() { OWN ITEM genname; genname[0] = '$'; itoa(arbchip++, &genname[1]); return(genname); }