#include "defs.h" /* * Read display list into dynamic area. * * fn = file name; null name produces a clean slate. */ #define BLKSIZ 512 input(fn) REG STRING fn; { REG INT n; REG ADR a; DL p; ERR saverr; setname(fn); newslate(fn); copyjmp(onerror, saverr); if(n=setjmp(onerror)){ newslate(fn); copyjmp(saverr, onerror); return; } fileopen(filename, 0); a = adr(dstart)-BLKSIZ; do{ a += BLKSIZ; morecore(BLKSIZ); n=read(openfd, a, BLKSIZ); } while(n==BLKSIZ); /* too high but will be reset shortly * succa must be safe if the type is checked */ dend = dlim; fileclose(); if(((p = dstart)->type != 'Z') || version() != VERSION) error("bad .g file"); arbchip = 1; p = dstart; while(p) { p=succa(p); switch(p->type){ case 'Z': dend = succa(p); p=0; break; case 'w': if((p->flag&END)==0) p->flag |= DIRTY; case 'J': case 'c': { STRING n = dln(p)->name; if(*n++ == '$' && number(n)) { INT i; if((i=geti(n))>=arbchip) arbchip = i+1; } } } } cleanall(); copyjmp(saverr, onerror); } /* * Initialize dynamic area to be empty. */ LOC newslate(fn) STRING fn; { REG DL p; REG DL a; if(dstart==nil(DL)) dstart = dl(sbrk(0)); p = dend = dstart; dlim = a = dl(round(adr(p)+1, 512)); brk(adr(a)); p->flag=0; while(*fn) fn++; if(*--fn == 'g' && *--fn == '.') { STRING sn=fn; *fn = 0; do{fn--;} while(digit(*fn)); p->y = atoi(++fn); *sn='.'; } else{ p->y = 0; } newdlp(BEFORE, p, 'Z', END, point(0, 0)); newdlh(BEFORE, p, 'M', END); newdln(BEFORE, p, 'w', END, "\\", nil(STRING)); newdln(BEFORE, p, 'c', END, "\\", nil(STRING)); newdlh(BEFORE, p, 'J', END); newdlh(BEFORE, p, 'M', START); newdlh(BEFORE, p, 'B', END); newdln(BEFORE, p, 'L', END, "\\", nil(STRING)); newdlp(BEFORE, p, 'Z', START, point(VERSION, 0)); arbchip = 1; modified = 0; } /* * Write out display list to a file. * * fn = file name; if null, write on file last named */ output(fn) STRING fn; { REG INT L; setname(fn); fileopen(filename, 1); L = adr(dend)-adr(dstart); chkwt(openfd, adr(dstart), L); fileclose(); }