int ps_write_len (PS ps, PE pe) { byte buffer[1 + sizeof (PElementLen)]; byte *bp = buffer, *ep; PElementLen len; if ((len = pe -> pe_len) == PE_LEN_INDF) *bp++ = PE_LEN_XTND; else if (len <= PE_LEN_SMAX) *bp++ = len & 0xff; else { ep = buffer + sizeof buffer - 1; for (bp = ep; len != 0 && buffer < bp; len >>= 8) *bp-- = len & 0xff; *bp = PE_LEN_XTND | ((ep - bp) & 0xff); if (ps_write (ps, bp, ep - bp + 1) == NOTOK) return NOTOK; return OK; } if (ps_write (ps, buffer, bp - buffer) == NOTOK) return NOTOK; return OK; }
void ps_end(void) { ps_write("stroke"); ps_write("grestore"); ps_write("end"); ps_write("showpage"); ps_write_pars(psfile); fclose(psfile); PltFmtFlag = 0; if (Xup) init_x11(); }
int ps_write_id (PS ps, PE pe) { byte buffer[1 + sizeof (PElementID)]; byte *bp = buffer; PElementForm form; PElementID id; if ((form = pe -> pe_form) == PE_FORM_ICONS) form = PE_FORM_CONS; *bp = ((pe -> pe_class << PE_CLASS_SHIFT) & PE_CLASS_MASK) | ((form << PE_FORM_SHIFT) & PE_FORM_MASK); if ((id = pe -> pe_id) < PE_ID_XTND) *bp++ |= id; else { byte *ep; PElementID jd; *bp |= PE_ID_XTND; ep = buffer; for (jd = id; jd != 0; jd >>= PE_ID_SHIFT) ep++; for (bp = ep; id != 0; id >>= PE_ID_SHIFT) *bp-- = id & PE_ID_MASK; for (bp = buffer + 1; bp < ep; bp++) *bp |= PE_ID_MORE; bp = ++ep; } if (ps_write (ps, buffer, bp - buffer) == NOTOK) return NOTOK; return OK; }