static char * rbody(Biobuf *in) { Bufblock *buf; int r, lastr; char *p; lastr = '\n'; buf = newbuf(); for(;;) { r = Bgetrune(in); if (r < 0) break; if (lastr == '\n') { if (r == '#') rinsert(buf, r); else if (r != ' ' && r != '\t') { Bungetrune(in); break; } } else rinsert(buf, r); lastr = r; if (r == '\n') mkinline++; } insert(buf, 0); p = strdup(buf->start); freebuf(buf); return p; }
/* * get next character stripping escaped newlines * the flag specifies whether escaped newlines are to be elided or * replaced with a blank. */ int nextrune(Biobuf *bp, int elide) { int c, c2; static int savec; if(savec){ c = savec; savec = 0; return c; } for (;;) { c = Bgetrune(bp); if (c == '\\') { c2 = Bgetrune(bp); if(c2 == '\r'){ savec = c2; c2 = Bgetrune(bp); } if (c2 == '\n') { savec = 0; mkinline++; if (elide) continue; return ' '; } Bungetrune(bp); } if (c == '\n') mkinline++; return c; } }
/* * Input an escaped token. Possible escape chars are single-quote, * double-quote and backslash. Only the first is a valid escape for * rc; the others are just inserted into the receiving buffer. */ int escapetoken(Biobuf *bp, Bufblock *buf, int preserve, int esc) { int c, line; if(esc != '\'') return 1; line = mkinline; while((c = nextrune(bp, 0)) > 0){ if(c == '\''){ if(preserve) rinsert(buf, c); c = Bgetrune(bp); if (c < 0) break; if(c != '\''){ Bungetrune(bp); return 1; } } rinsert(buf, c); } SYNERR(line); fprint(2, "missing closing %c\n", esc); return 0; }
int moreinput(Biobufhdr *fin) { int c; if ((c=Bgetrune(fin)) != Beof) { if (c == ' ' || c == '\t') return 1; /* skip a space */ Bungetrune(fin); } return 0; }
void inpic(void) { int c1; Rune *p1; /* SKIP1;*/ while(C1 != '\n') if(c == '<'){ SKIP1; return; } p1 = line; c = '\n'; for(;;) { c1 = c; if(C1 == '.' && c1 == '\n') { if(C1 != 'P' || C1 != 'E') { if(c != '\n'){ SKIP1; c = '\n'; } continue; } SKIP1; return; } else if(c == '\"') { while(C1 != '\"') { if(c == '\\') { if(C1 == '\"') continue; Bungetrune(&(infile->Biobufhdr)); backsl(); } else *p1++ = c; } *p1++ = ' '; } else if(c == '\n' && p1 != line) { *p1 = '\0'; if(wordflag) putwords(); else Bprint(&(bout.Biobufhdr), "%S\n\n", line); p1 = line; } } }
/* * get next character stripping escaped newlines * the flag specifies whether escaped newlines are to be elided or * replaced with a blank. */ int nextrune(Biobuf *bp, int elide) { int c; for (;;) { c = Bgetrune(bp); if (c == '\\') { if (Bgetrune(bp) == '\n') { mkinline++; if (elide) continue; return ' '; } Bungetrune(bp); } if (c == '\n') mkinline++; return c; } }
int ungetc(Biobuf *in) { prevc = thisc; return Bungetrune(in); }
void ungetc(Biobuf *b) { cno--; Bungetrune(&(b->Biobufhdr)); }
void main(void) { int c, n; char str[100], *args[10]; int jfont, curfont; if(initdraw(0, fontfile, 0) < 0){ fprint(2, "mnihongo: can't initialize display: %r\n"); exits("open"); } Binit(&bin, 0, OREAD); Binit(&bout, 1, OWRITE); jfont = -1; curfont = 1; while ((c = Bgetc(&bin)) >= 0) { switch (c) { case '\n': /* when input is text */ case ' ': case '\0': /* occasional noise creeps in */ putchar(c); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': /* two motion digits plus a character */ putchar(c); /* digit 1 */ n = (c-'0')*10; c = Bgetc(&bin); putchar(c); /* digit 2 */ n += c - '0'; hmot(n); putchar(Bgetc(&bin)); /* char itself */ break; case 'c': /* single character */ c = Bgetrune(&bin); if(c==' ') /* why does this happen? it's troff - bwk */ break; else if(jfont == curfont){ Bungetrune(&bin); Bgetstr(&bin, str); kanji(str); }else{ putchar('c'); putchar(c); } break; case 'C': Bgetstr(&bin, str); Bprint(&bout, "C%s", str); break; case 'f': Bgetstr(&bin, str); curfont = atoi(str); if(curfont < 0 || curfont > 20) curfont = 1; /* sanity */ Bprint(&bout, "%c%s", c, str); break; case 'N': /* absolute character number */ case 's': case 'p': /* new page */ Bgetint(&bin, &n); Bprint(&bout, "%c%d", c, n); break; case 'H': /* absolute horizontal motion */ Bgetint(&bin, &n); Bprint(&bout, "%c%d", c, n); hgoto(n); break; case 'h': /* relative horizontal motion */ Bgetint(&bin, &n); Bprint(&bout, "%c%d", c, n); hmot(n); break; case 'V': Bgetint(&bin, &n); Bprint(&bout, "%c%d", c, n); vgoto(n); break; case 'v': Bgetint(&bin, &n); Bprint(&bout, "%c%d", c, n); vmot(n); break; case 'w': /* word space */ putchar(c); break; case 'x': /* device control */ Bgetline(&bin, str); Bprint(&bout, "%c%s", c, str); if(tokenize(str, args, 10)>2 && args[0][0]=='f' && ('0'<=args[1][0] && args[1][0]<='9')){ if(strncmp(args[2], "Jp", 2) == 0) jfont = atoi(args[1]); else if(atoi(args[1]) == jfont) jfont = -1; } break; case 'D': /* draw function */ case 'n': /* end of line */ case '#': /* comment */ Bgetline(&bin, str); Bprint(&bout, "%c%s", c, str); break; default: fprint(2, "mnihongo: unknown input character %o %c\n", c, c); exits("error"); } } }
void ungetc(Biobuf *b) { cno--; Bungetrune(b); }
/* * skip over a complete backslash vconstruction */ void backsl(void) { int bdelim; sw: switch(C1) { case '"': SKIP1; return; case 's': if(C1 == '\\') backsl(); else { while(C1>='0' && c<='9') ; Bungetrune(&(infile->Biobufhdr)); c = '0'; } lp--; return; case 'f': case 'n': case '*': if(C1 != '(') return; case '(': if(msflag) { if(C == 'e') { if(C1 == 'm') { *lp = '-'; return; } } else if(c != '\n') C1; return; } if(C1 != '\n') C1; return; case '$': C1; /* discard argument number */ return; case 'b': case 'x': case 'v': case 'h': case 'w': case 'o': case 'l': case 'L': if((bdelim=C1) == '\n') return; while(C1!='\n' && c!=bdelim) if(c == '\\') backsl(); return; case '\\': if(inmacro) goto sw; default: return; } }