/* * Starting from b, find next line beginning with a tag. * Don't go past e, but assume *e==0. * Return tag value, or -1 if no more tags before e. * Set pvb to beginning of value (after tag). * Set pve to point at newline that ends the value. */ static long sget(char *b, char *e, char **pvb, char **pve) { char *p; char buf[3]; long t, tans; buf[2] = 0; tans = -1; for(p = b;;) { if(p[2] == ' ') { buf[0] = p[0]; buf[1] = p[1]; t = lookassoc(tagtab, asize(tagtab), buf); if(t < 0) { if(debug) err("tag %s\n", buf); p += 3; } else { if(tans < 0) { p += 3; tans = t; *pvb = p; } else { *pve = p; break; } } } p = strchr(p, '\n'); if(!p || ++p >= e) { if(tans >= 0) *pve = e-1; break; } } return tans; }
void pcollprintentry(Entry e, int cmd) { char *p, *pe; long r, rprev, t, rlig; int saveoi; Rune *transtab; p = e.start; pe = e.end; transtab = normtab; rprev = NONE; changett(0, 0, 0); curentry = e; saveoi = 0; if(cmd == 'h') outinhibit = 1; while(p < pe) { if(cmd == 'r') { outchar(*p++); continue; } r = transtab[(*p++)&0x7F]; if(r < NONE) { /* Emit the rune, but buffer in case of ligature */ if(rprev != NONE) outrune(rprev); rprev = r; } else if(r == TAGS) { p = gettag(p, pe); t = lookassoc(tagtab, asize(tagtab), tag); if(t == -1) { if(debug && !outinhibit) err("tag %ld %d %s", e.doff, cursize, tag); continue; } if(t < NONE) { if(rprev != NONE) outrune(rprev); rprev = t; } else if(t >= LIGS && t < LIGE) { /* handle possible ligature */ rlig = liglookup(t, rprev); if(rlig != NONE) rprev = rlig; /* overwrite rprev */ else { /* could print accent, but let's not */ if(rprev != NONE) outrune(rprev); rprev = NONE; } } else if(t >= MULTI && t < MULTIE) { if(rprev != NONE) { outrune(rprev); rprev = NONE; } outrunes(multitab[t-MULTI]); } else { if(rprev != NONE) { outrune(rprev); rprev = NONE; } switch(t){ case H: if(cmd == 'h') outinhibit = 0; else outnl(0); break; case X: if(cmd == 'h') outinhibit = 1; else outchars(". "); break; case Ps: /* don't know enough of pron. key yet */ saveoi = outinhibit; outinhibit = 1; break; case Pe: outinhibit = saveoi; break; } } } } if(cmd == 'h') outinhibit = 0; outnl(0); }
/* * cmd is one of: * 'p': normal print * 'h': just print headwords * 'P': print raw */ void pgwprintentry(Entry e, int cmd) { char *p, *pe; int t; long r, rprev, rlig; Rune *transtab; p = e.start; pe = e.end; transtab = normtab; rprev = NONE; changett(0, 0, 0); curentry = e; if(cmd == 'h') outinhibit = 1; while(p < pe) { if(cmd == 'r') { outchar(*p++); continue; } r = transtab[(*p++)&0x7F]; if(r < NONE) { /* Emit the rune, but buffer in case of ligature */ if(rprev != NONE) outrune(rprev); rprev = r; } else if(r == SPCS) { /* Start of special character name */ p = getspec(p, pe); r = lookassoc(spectab, asize(spectab), spec); if(r == -1) { if(debug) err("spec %ld %d %s", e.doff, cursize, spec); r = L'�'; } if(r >= LIGS && r < LIGE) { /* handle possible ligature */ rlig = liglookup(r, rprev); if(rlig != NONE) rprev = rlig; /* overwrite rprev */ else { /* could print accent, but let's not */ if(rprev != NONE) outrune(rprev); rprev = NONE; } } else if(r >= MULTI && r < MULTIE) { if(rprev != NONE) { outrune(rprev); rprev = NONE; } outrunes(multitab[r-MULTI]); } else if(r == PAR) { if(rprev != NONE) { outrune(rprev); rprev = NONE; } outnl(1); } else { if(rprev != NONE) outrune(rprev); rprev = r; } } else if(r == TAGS) { /* Start of tag name */ if(rprev != NONE) { outrune(rprev); rprev = NONE; } p = gettag(p, pe); t = lookassoc(tagtab, asize(tagtab), tag); if(t == -1) { if(debug) err("tag %ld %d %s", e.doff, cursize, tag); continue; } switch(t) { case Hw: if(cmd == 'h') { if(!tagstarts) outchar(' '); outinhibit = !tagstarts; } break; case Sn: if(tagstarts) { outnl(2); } break; case P: outnl(tagstarts); break; case Col: case Br: case Blockquote: if(tagstarts) outnl(1); break; case U: outchar('/'); } } } if(cmd == 'h') { outinhibit = 0; outnl(0); } }