Blame


1 b2cfc4e2 2003-09-30 devnull #include "lib9.h"
2 b2cfc4e2 2003-09-30 devnull #include <bio.h>
3 b2cfc4e2 2003-09-30 devnull #include <utf.h>
4 b2cfc4e2 2003-09-30 devnull
5 b2cfc4e2 2003-09-30 devnull long
6 b2cfc4e2 2003-09-30 devnull Bgetrune(Biobuf *bp)
7 b2cfc4e2 2003-09-30 devnull {
8 b2cfc4e2 2003-09-30 devnull int c, i;
9 b2cfc4e2 2003-09-30 devnull Rune rune;
10 0cadb430 2009-09-11 russcox char str[UTFmax];
11 b2cfc4e2 2003-09-30 devnull
12 b2cfc4e2 2003-09-30 devnull c = Bgetc(bp);
13 b2cfc4e2 2003-09-30 devnull if(c < Runeself) { /* one char */
14 b2cfc4e2 2003-09-30 devnull bp->runesize = 1;
15 b2cfc4e2 2003-09-30 devnull return c;
16 b2cfc4e2 2003-09-30 devnull }
17 b2cfc4e2 2003-09-30 devnull str[0] = c;
18 b2cfc4e2 2003-09-30 devnull
19 b2cfc4e2 2003-09-30 devnull for(i=1;;) {
20 b2cfc4e2 2003-09-30 devnull c = Bgetc(bp);
21 b2cfc4e2 2003-09-30 devnull if(c < 0)
22 b2cfc4e2 2003-09-30 devnull return c;
23 b2cfc4e2 2003-09-30 devnull str[i++] = c;
24 b2cfc4e2 2003-09-30 devnull
25 b2cfc4e2 2003-09-30 devnull if(fullrune(str, i)) {
26 b2cfc4e2 2003-09-30 devnull bp->runesize = chartorune(&rune, str);
27 b2cfc4e2 2003-09-30 devnull while(i > bp->runesize) {
28 b2cfc4e2 2003-09-30 devnull Bungetc(bp);
29 b2cfc4e2 2003-09-30 devnull i--;
30 b2cfc4e2 2003-09-30 devnull }
31 b2cfc4e2 2003-09-30 devnull return rune;
32 b2cfc4e2 2003-09-30 devnull }
33 b2cfc4e2 2003-09-30 devnull }
34 b2cfc4e2 2003-09-30 devnull }
35 b2cfc4e2 2003-09-30 devnull
36 b2cfc4e2 2003-09-30 devnull int
37 b2cfc4e2 2003-09-30 devnull Bungetrune(Biobuf *bp)
38 b2cfc4e2 2003-09-30 devnull {
39 b2cfc4e2 2003-09-30 devnull
40 b2cfc4e2 2003-09-30 devnull if(bp->state == Bracteof)
41 b2cfc4e2 2003-09-30 devnull bp->state = Bractive;
42 b2cfc4e2 2003-09-30 devnull if(bp->state != Bractive)
43 b2cfc4e2 2003-09-30 devnull return Beof;
44 b2cfc4e2 2003-09-30 devnull bp->icount -= bp->runesize;
45 b2cfc4e2 2003-09-30 devnull bp->runesize = 0;
46 b2cfc4e2 2003-09-30 devnull return 1;
47 b2cfc4e2 2003-09-30 devnull }