123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 |
- /*
- * 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.
- */
- #include "a.h"
- /*
- * Section 2 - Font and character size control.
- */
-
- /* 2.1 - Character set */
- /* XXX
- *
- * \C'name' - character named name
- * \N'n' - character number
- * \(xx - two-letter character
- * \-
- * \`
- * \'
- * `
- * '
- * -
- */
- Rune*
- getqarg(void)
- {
- static Rune buf[MaxLine];
- int c;
- Rune *p, *e;
-
- p = buf;
- e = p+sizeof buf-1;
-
- if(getrune() != '\'')
- return nil;
- while(p < e){
- c = getrune();
- if(c < 0)
- return nil;
- if(c == '\'')
- break;
- *p++ = c;
- }
- *p = 0;
- return buf;
- }
- int
- e_N(void)
- {
- Rune *a;
- if((a = getqarg()) == nil)
- goto error;
- return eval(a);
- error:
- warn("malformed %CN'...'", backslash);
- return 0;
- }
- int
- e_paren(void)
- {
- int c, cc;
- Rune buf[2], r;
-
- if((c = getrune()) < 0 || c == '\n')
- goto error;
- if((cc = getrune()) < 0 || cc == '\n')
- goto error;
- buf[0] = c;
- buf[1] = cc;
- r = troff2rune(buf);
- if(r == Runeerror)
- warn("unknown char %C(%C%C", backslash, c, cc);
- return r;
-
- error:
- warn("malformed %C(xx", backslash);
- return 0;
- }
- /* 2.2 - Fonts */
- Rune fonttab[10][100];
- /*
- * \fx \f(xx \fN - font change
- * number register .f - current font
- * \f0 previous font (undocumented?)
- */
- /* change to font f. also \fx, \f(xx, \fN */
- /* .ft LongName is okay - temporarily at fp 0 */
- void
- ft(Rune *f)
- {
- int i;
- int fn;
-
- if(f && runestrcmp(f, L("P")) == 0)
- f = nil;
- if(f == nil)
- fn = 0;
- else if(isdigit(f[0]))
- fn = eval(f);
- else{
- for(i=0; i<nelem(fonttab); i++){
- if(runestrcmp(fonttab[i], f) == 0){
- fn = i;
- goto have;
- }
- }
- warn("unknown font %S", f);
- fn = 1;
- }
- have:
- if(fn < 0 || fn >= nelem(fonttab)){
- warn("unknown font %d", fn);
- fn = 1;
- }
- if(fn == 0)
- fn = getnr(L(".f0"));
- nr(L(".f0"), getnr(L(".f")));
- nr(L(".f"), fn);
- runmacro1(L("font"));
- }
- /* mount font named f on physical position N */
- void
- fp(int i, Rune *f)
- {
- if(i <= 0 || i >= nelem(fonttab)){
- warn("bad font position %d", i);
- return;
- }
- runestrecpy(fonttab[i], fonttab[i]+sizeof fonttab[i], f);
- }
-
- int
- e_f(void)
- {
- ft(getname());
- return 0;
- }
- void
- r_ft(int argc, Rune **argv)
- {
- if(argc == 1)
- ft(nil);
- else
- ft(argv[1]);
- }
- void
- r_fp(int argc, Rune **argv)
- {
- if(argc < 3){
- warn("missing arguments to %Cfp", dot);
- return;
- }
- fp(eval(argv[1]), argv[2]);
- }
- /* 2.3 - Character size */
- /* \H'±N' sets height */
- void
- ps(int s)
- {
- if(s == 0)
- s = getnr(L(".s0"));
- nr(L(".s0"), getnr(L(".s")));
- nr(L(".s"), s);
- runmacro1(L("font"));
- }
- /* set point size */
- void
- r_ps(int argc, Rune **argv)
- {
- Rune *p;
-
- if(argc == 1 || argv[1][0] == 0)
- ps(0);
- else{
- p = argv[1];
- if(p[0] == '-')
- ps(getnr(L(".s"))-eval(p+1));
- else if(p[0] == '+')
- ps(getnr(L(".s"))+eval(p+1));
- else
- ps(eval(p));
- }
- }
- int
- e_s(void)
- {
- int c, cc, ccc, n, twodigit;
-
- c = getnext();
- if(c < 0)
- return 0;
- if(c == '+' || c == '-'){
- cc = getnext();
- if(cc == '('){
- cc = getnext();
- ccc = getnext();
- if(cc < '0' || cc > '9' || ccc < '0' || ccc > '9'){
- warn("bad size %Cs%C(%C%C", backslash, c, cc, ccc);
- return 0;
- }
- n = (cc-'0')*10+ccc-'0';
- }else{
- if(cc < '0' || cc > '9'){
- warn("bad size %Cs%C%C", backslash, c, cc);
- return 0;
- }
- n = cc-'0';
- }
- if(c == '+')
- ps(getnr(L(".s"))+n);
- else
- ps(getnr(L(".s"))-n);
- return 0;
- }
- twodigit = 0;
- if(c == '('){
- twodigit = 1;
- c = getnext();
- if(c < 0)
- return 0;
- }
- if(c < '0' || c > '9'){
- warn("bad size %Cs%C", backslash, c);
- ungetnext(c);
- return 0;
- }
- if(twodigit || (c < '4' && c != '0')){
- cc = getnext();
- if(c < 0)
- return 0;
- n = (c-'0')*10+cc-'0';
- }else
- n = c-'0';
- ps(n);
- return 0;
- }
- void
- t2init(void)
- {
- fp(1, L("R"));
- fp(2, L("I"));
- fp(3, L("B"));
- fp(4, L("BI"));
- fp(5, L("CW"));
-
- nr(L(".s"), 10);
- nr(L(".s0"), 10);
- addreq(L("ft"), r_ft, -1);
- addreq(L("fp"), r_fp, -1);
- addreq(L("ps"), r_ps, -1);
- addreq(L("ss"), r_warn, -1);
- addreq(L("cs"), r_warn, -1);
- addreq(L("bd"), r_warn, -1);
- addesc('f', e_f, 0);
- addesc('s', e_s, 0);
- addesc('(', e_paren, 0); /* ) */
- addesc('C', e_warn, 0);
- addesc('N', e_N, 0);
- /* \- \' \` are handled in html.c */
- }
|