/* * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ /* * troff5.c * * misc processing requests */ #include "tdef.h"#include "fns.h"#include "ext.h" int iflist[NIF];int ifx;int ifnum = 0; /* trying numeric expression for .if or .ie condition */ void casead(void){ int i; ad = 1; /* leave admod alone */ if (skip()) return; switch (i = cbits(getch())) { case 'r': /* right adj, left ragged */ admod = 2; break; case 'l': /* left adj, right ragged */ admod = ad = 0; /* same as casena */ break; case 'c': /*centered adj*/ admod = 1; break; case 'b': case 'n': admod = 0; break; case '0': case '2': case '4': ad = 0; case '1': case '3': case '5': admod = (i - '0') / 2; }} void casena(void){ ad = 0;} void casefi(void){ tbreak(); fi = 1; pendnf = 0;} void casenf(void){ tbreak(); fi = 0;} void casers(void){ dip->nls = 0;} void casens(void){ dip->nls++;} chget(int c){ Tchar i; i = 0; if (skip() || ismot(i = getch()) || cbits(i) == ' ' || cbits(i) == '\n') { ch = i; return(c); } else return cbits(i); /* was (i & BYTEMASK) */} void casecc(void){ cc = chget('.');} void casec2(void){ c2 = chget('\'');} void casehc(void){ ohc = chget(OHC);} void casetc(void){ tabc = chget(0);} void caselc(void){ dotc = chget(0);} void casehy(void){ int i; hyf = 1; if (skip()) return; noscale++; i = atoi0(); noscale = 0; if (nonumb) return; hyf = max(i, 0);} void casenh(void){ hyf = 0;} max(int aa, int bb){ if (aa > bb) return(aa); else return(bb);} void casece(void){ int i; noscale++; skip(); i = max(atoi0(), 0); if (nonumb) i = 1; tbreak(); ce = i; noscale = 0;} void casein(void){ int i; if (skip()) i = in1; else { i = max(hnumb(&in), 0); if (nonumb) i = in1; } tbreak(); in1 = in; in = i; if (!nc) { un = in; setnel(); }} void casell(void){ int i; if (skip()) i = ll1; else { i = max(hnumb(&ll), INCH / 10); if (nonumb) i = ll1; } ll1 = ll; ll = i; setnel();} void caselt(void){ int i; if (skip()) i = lt1; else { i = max(hnumb(<), 0); if (nonumb) i = lt1; } lt1 = lt; lt = i;} void caseti(void){ int i; if (skip()) return; i = max(hnumb(&in), 0); tbreak(); un1 = i; setnel();} void casels(void){ int i; noscale++; if (skip()) i = ls1; else { i = max(inumb(&ls), 1); if (nonumb) i = ls1; } ls1 = ls; ls = i; noscale = 0;} void casepo(void){ int i; if (skip()) i = po1; else { i = max(hnumb(&po), 0); if (nonumb) i = po1; } po1 = po; po = i; if (TROFF & !ascii) esc += po - po1;} void casepl(void){ int i; skip(); if ((i = vnumb(&pl)) == 0) pl = 11 * INCH; /*11in*/ else pl = i; if (numtabp[NL].val > pl) numtabp[NL].val = pl;} void casewh(void){ int i, j, k; lgf++; skip(); i = vnumb((int *)0); if (nonumb) return; skip(); j = getrq(); if ((k = findn(i)) != NTRAP) { mlist[k] = j; return; } for (k = 0; k < NTRAP; k++) if (mlist[k] == 0) break; if (k == NTRAP) { flusho(); ERROR "cannot plant trap." WARN; return; } mlist[k] = j; nlist[k] = i;} void casech(void){ int i, j, k; lgf++; skip(); if (!(j = getrq())) return; else for (k = 0; k < NTRAP; k++) if (mlist[k] == j) break; if (k == NTRAP) return; skip(); i = vnumb((int *)0); if (nonumb) mlist[k] = 0; nlist[k] = i;} findn(int i){ int k; for (k = 0; k < NTRAP; k++) if ((nlist[k] == i) && (mlist[k] != 0)) break; return(k);} void casepn(void){ int i; skip(); noscale++; i = max(inumb(&numtabp[PN].val), 0); noscale = 0; if (!nonumb) { npn = i; npnflg++; }} void casebp(void){ int i; Stack *savframe; if (dip != d) return; savframe = frame; skip(); if ((i = inumb(&numtabp[PN].val)) < 0) i = 0; tbreak(); if (!nonumb) { npn = i; npnflg++; } else if (dip->nls) return; eject(savframe);} void casetm(void){ casetm1(0, stderr);} void casefm(void){ static struct fcache { char *name; FILE *fp; } fcache[15]; int i; if ( skip() || !getname()) { ERROR "fm: missing filename" WARN; return; } for (i = 0; i < 15 && fcache[i].fp != NULL; i++) { if (strcmp(nextf, fcache[i].name) == 0) break; } if (i >= 15) { ERROR "fm: too many streams" WARN; return; } if (fcache[i].fp == NULL) { if( (fcache[i].fp = fopen(nextf, "w")) == NULL) { ERROR "fm: cannot open %s", nextf WARN; return; } fcache[i].name = strdupl(nextf); } casetm1(0, fcache[i].fp);} void casetm1(int ab, FILE *out) { int i, j, c; char *p; char tmbuf[NTM]; lgf++; copyf++; if (ab) { if (skip()) ERROR "User Abort" WARN; else { extern int error; int savtrac = trace; trace = 0; noscale++; i = inumb(&trace); noscale--; if (i) { error = i; if (nlflg || skip()) ERROR "User Abort, exit code %d", i WARN; } trace = savtrac; } } else skip(); for (i = 0; i < NTM - 2; ) { if ((c = cbits(getch())) == '\n' || c == RIGHT) break; else if (c == MINUS) { /* special pleading for strange encodings */ tmbuf[i++] = '\\'; tmbuf[i++] = '-'; } else if (c == PRESC) { tmbuf[i++] = '\\'; tmbuf[i++] = 'e'; } else if (c == FILLER) { tmbuf[i++] = '\\'; tmbuf[i++] = '&'; } else if (c == UNPAD) { tmbuf[i++] = '\\'; tmbuf[i++] = ' '; } else if (c == OHC) { tmbuf[i++] = '\\'; tmbuf[i++] = '%'; } else if (c >= ALPHABET) { p = chname(c); switch (*p) { case MBchar: sprintf(&tmbuf[i], p+1); break; case Number: sprintf(&tmbuf[i], "\\N'%s'", p+1); break; case Troffchar: if (strlen(p+1) == 2) sprintf(&tmbuf[i], "\\(%s", p+1); else sprintf(&tmbuf[i], "\\C'%s'", p+1); break; default: sprintf(&tmbuf[i]," %s? ", p); break; } j = strlen(&tmbuf[i]); i += j; } else tmbuf[i++] = c; } tmbuf[i] = 0; if (ab) /* truncate output */Lines 1–500 of 1159. Load more
/* * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ /* * troff5.c * * misc processing requests */ #include "tdef.h" #include "fns.h" #include "ext.h" int iflist[NIF]; int ifx; int ifnum = 0; /* trying numeric expression for .if or .ie condition */ void casead(void) { int i; ad = 1; /* leave admod alone */ if (skip()) return; switch (i = cbits(getch())) { case 'r': /* right adj, left ragged */ admod = 2; break; case 'l': /* left adj, right ragged */ admod = ad = 0; /* same as casena */ break; case 'c': /*centered adj*/ admod = 1; break; case 'b': case 'n': admod = 0; break; case '0': case '2': case '4': ad = 0; case '1': case '3': case '5': admod = (i - '0') / 2; } } void casena(void) { ad = 0; } void casefi(void) { tbreak(); fi = 1; pendnf = 0; } void casenf(void) { tbreak(); fi = 0; } void casers(void) { dip->nls = 0; } void casens(void) { dip->nls++; } chget(int c) { Tchar i; i = 0; if (skip() || ismot(i = getch()) || cbits(i) == ' ' || cbits(i) == '\n') { ch = i; return(c); } else return cbits(i); /* was (i & BYTEMASK) */ } void casecc(void) { cc = chget('.'); } void casec2(void) { c2 = chget('\''); } void casehc(void) { ohc = chget(OHC); } void casetc(void) { tabc = chget(0); } void caselc(void) { dotc = chget(0); } void casehy(void) { int i; hyf = 1; if (skip()) return; noscale++; i = atoi0(); noscale = 0; if (nonumb) return; hyf = max(i, 0); } void casenh(void) { hyf = 0; } max(int aa, int bb) { if (aa > bb) return(aa); else return(bb); } void casece(void) { int i; noscale++; skip(); i = max(atoi0(), 0); if (nonumb) i = 1; tbreak(); ce = i; noscale = 0; } void casein(void) { int i; if (skip()) i = in1; else { i = max(hnumb(&in), 0); if (nonumb) i = in1; } tbreak(); in1 = in; in = i; if (!nc) { un = in; setnel(); } } void casell(void) { int i; if (skip()) i = ll1; else { i = max(hnumb(&ll), INCH / 10); if (nonumb) i = ll1; } ll1 = ll; ll = i; setnel(); } void caselt(void) { int i; if (skip()) i = lt1; else { i = max(hnumb(<), 0); if (nonumb) i = lt1; } lt1 = lt; lt = i; } void caseti(void) { int i; if (skip()) return; i = max(hnumb(&in), 0); tbreak(); un1 = i; setnel(); } void casels(void) { int i; noscale++; if (skip()) i = ls1; else { i = max(inumb(&ls), 1); if (nonumb) i = ls1; } ls1 = ls; ls = i; noscale = 0; } void casepo(void) { int i; if (skip()) i = po1; else { i = max(hnumb(&po), 0); if (nonumb) i = po1; } po1 = po; po = i; if (TROFF & !ascii) esc += po - po1; } void casepl(void) { int i; skip(); if ((i = vnumb(&pl)) == 0) pl = 11 * INCH; /*11in*/ else pl = i; if (numtabp[NL].val > pl) numtabp[NL].val = pl; } void casewh(void) { int i, j, k; lgf++; skip(); i = vnumb((int *)0); if (nonumb) return; skip(); j = getrq(); if ((k = findn(i)) != NTRAP) { mlist[k] = j; return; } for (k = 0; k < NTRAP; k++) if (mlist[k] == 0) break; if (k == NTRAP) { flusho(); ERROR "cannot plant trap." WARN; return; } mlist[k] = j; nlist[k] = i; } void casech(void) { int i, j, k; lgf++; skip(); if (!(j = getrq())) return; else for (k = 0; k < NTRAP; k++) if (mlist[k] == j) break; if (k == NTRAP) return; skip(); i = vnumb((int *)0); if (nonumb) mlist[k] = 0; nlist[k] = i; } findn(int i) { int k; for (k = 0; k < NTRAP; k++) if ((nlist[k] == i) && (mlist[k] != 0)) break; return(k); } void casepn(void) { int i; skip(); noscale++; i = max(inumb(&numtabp[PN].val), 0); noscale = 0; if (!nonumb) { npn = i; npnflg++; } } void casebp(void) { int i; Stack *savframe; if (dip != d) return; savframe = frame; skip(); if ((i = inumb(&numtabp[PN].val)) < 0) i = 0; tbreak(); if (!nonumb) { npn = i; npnflg++; } else if (dip->nls) return; eject(savframe); } void casetm(void) { casetm1(0, stderr); } void casefm(void) { static struct fcache { char *name; FILE *fp; } fcache[15]; int i; if ( skip() || !getname()) { ERROR "fm: missing filename" WARN; return; } for (i = 0; i < 15 && fcache[i].fp != NULL; i++) { if (strcmp(nextf, fcache[i].name) == 0) break; } if (i >= 15) { ERROR "fm: too many streams" WARN; return; } if (fcache[i].fp == NULL) { if( (fcache[i].fp = fopen(nextf, "w")) == NULL) { ERROR "fm: cannot open %s", nextf WARN; return; } fcache[i].name = strdupl(nextf); } casetm1(0, fcache[i].fp); } void casetm1(int ab, FILE *out) { int i, j, c; char *p; char tmbuf[NTM]; lgf++; copyf++; if (ab) { if (skip()) ERROR "User Abort" WARN; else { extern int error; int savtrac = trace; trace = 0; noscale++; i = inumb(&trace); noscale--; if (i) { error = i; if (nlflg || skip()) ERROR "User Abort, exit code %d", i WARN; } trace = savtrac; } } else skip(); for (i = 0; i < NTM - 2; ) { if ((c = cbits(getch())) == '\n' || c == RIGHT) break; else if (c == MINUS) { /* special pleading for strange encodings */ tmbuf[i++] = '\\'; tmbuf[i++] = '-'; } else if (c == PRESC) { tmbuf[i++] = '\\'; tmbuf[i++] = 'e'; } else if (c == FILLER) { tmbuf[i++] = '\\'; tmbuf[i++] = '&'; } else if (c == UNPAD) { tmbuf[i++] = '\\'; tmbuf[i++] = ' '; } else if (c == OHC) { tmbuf[i++] = '\\'; tmbuf[i++] = '%'; } else if (c >= ALPHABET) { p = chname(c); switch (*p) { case MBchar: sprintf(&tmbuf[i], p+1); break; case Number: sprintf(&tmbuf[i], "\\N'%s'", p+1); break; case Troffchar: if (strlen(p+1) == 2) sprintf(&tmbuf[i], "\\(%s", p+1); else sprintf(&tmbuf[i], "\\C'%s'", p+1); break; default: sprintf(&tmbuf[i]," %s? ", p); break; } j = strlen(&tmbuf[i]); i += j; } else tmbuf[i++] = c; } tmbuf[i] = 0; if (ab) /* truncate output */