/* roff.c, font control */ #include "nroff.h" struct font *curfont; /* current font */ struct font *fonts; /* fonts */ #define STDFONT 4 int nfonts = STDFONT; /* number of fonts */ static struct font Nfonts[STDFONT]; static struct font *prevfont; /* * setup the default fonts */ static char inames[] = "RIBS"; setfonts() { struct font *fp; int i; fp = Nfonts; for(i = 0 ; i < STDFONT ; i++, fp++){ fp->f_name[0] = inames[i]; fp->f_pos = i+1; fp->f_next = fonts; fonts = fp; termsetf(fp); /* set fonts for current terminal */ } curfont = Nfonts; } chfont(ptr) /* doesn't do numbered fonts yet */ char **ptr; { char *p = *ptr; char name[2]; struct font *fp; if(*p == '('){ name[0] = *++p; name[1] = *++p; *ptr = p; } else { name[0] = *p; name[1] = '\0'; if(name[0] == 'P'){ /* the previous font */ fp = prevfont; goto found; } } for(fp = fonts ; fp ; fp = fp->f_next) if(fp->f_name[0] == name[0] && fp->f_name[1] == name[1]) break; found:; if(fp == 0) /* no font known */ return; /* change font, */ if(curfont->f_end) (*curfont->f_end)(fp); prevfont = curfont; curfont = fp; if(fp->f_start) (*fp->f_start)(prevfont); } /* default routines to deal with going into and out of different fonts */ fstrt_str(pfp) struct font *pfp; { struct font *fp = curfont; char *p; p = fp->fstrt_str; if(p == 0) return; for(;*p; p++) PUT(*p); } /* end of font */ fend_str(pfp) struct font *pfp; { struct font *fp = curfont; char *p; p = fp->fend_str; if(p == 0) return; for(;*p; p++) PUT(*p); } term_und(c) { if(isprint(c)){ PUT('_'); PUT('\b'); } PUT(c); } termsetf(fp) /* set fonts for current terminal */ struct font *fp; { switch(fp->f_name[0]){ case 'R': /* default, don't need anything special */ break; case 'I': /* go into italic mode, is underline */ fp->fstrt_str = "\0334"; fp->fend_str = "\0335"; fp->f_start = fstrt_str; fp->f_end = fend_str; /* fp->f_putc = term_und; */ break; case 'B': /* go into bold mode */ fp->fstrt_str = "\033G"; fp->fend_str = "\033H"; fp->f_start = fstrt_str; fp->f_end = fend_str; break; case 'S': /* special font mode */ break; } }