/* roff.c, title processing */ #include "nroff.h" puttl(ft, pageno) struct hft *ft; { char pnum[20]; int nlen; int llen, clen, rlen; char *p, *np; int totlen, i, outcol; lineno++; SPRING(lineno); if(*ft->left == 0 && *ft->center == 0 && *ft->right == 0){ PUTNL(); return; } sprintf(pnum, "%d", pageno); nlen = strlen(pnum); for(llen = 0, p = ft->left ; *p ; p++) if(*p == PAGENUM) llen += nlen; else llen++; for(clen = 0, p = ft->center ; *p ; p++) if(*p == PAGENUM) clen += nlen; else clen++; for(rlen = 0, p = ft->right ; *p ; p++) if(*p == PAGENUM) rlen += nlen; else rlen++; /* now fix up some limits */ if(clen > rmval / 3) clen = rmval / 3; totlen = rmval/2 - clen/2; if(llen > totlen) llen = totlen; if(rlen > totlen) rlen = totlen; /* now do the output */ outcol = llen; for(p = ft->left;llen; p++){ if(*p == PAGENUM){ i = nlen; if(i > llen) i = llen; llen -= i; for(np = pnum ; i ; i--,np++) PUT(*np); } else { llen--; PUT(*p); } } while(outcol < totlen){ outcol++; PUT(' '); } outcol += clen; for(p = ft->center;clen; p++){ if(*p == PAGENUM){ i = nlen; if(i > clen) i = clen; clen -= i; for(np = pnum ; i ; i--,np++) PUT(*np); } else { clen--; PUT(*p); } } while(outcol < rmval - rlen){ outcol++; PUT(' '); } for(p = ft->right;rlen; p++){ if(*p == PAGENUM){ i = nlen; if(i > rlen) i = rlen; rlen -= i; for(np = pnum ; i ; i--,np++) PUT(*np); } else { rlen--; PUT(*p); } } PUTNL(); } getftl(buf, ft) struct hft *ft; char *buf; { char *ttl; char *p; int c; ttl = ft->left; *ft->left = 0; *ft->center = 0; *ft->right = 0; for(;*buf;){ p = ttl; c = *buf++; while(*buf != '\0' && *buf != c) *p++ = *buf++; *p = 0; if(ttl == ft->left) ttl = ft->center; else if(ttl == ft->center) ttl = ft->right; else break; } } gettl(buf, ttl) char *buf, *ttl; { int c; c = 0; if(*buf == '\'' || *buf == '"') c = *buf++; while(*buf != c && *buf != '\0') *ttl++ = *buf++; *ttl = 0; } titil(buf) char *buf; { struct hft H; getftl(buf, &H); puttl(&H, curpage); }