aboutsummaryrefslogtreecommitdiff
path: root/src/base/io/getr.c
blob: 01b0f45ccd6bac82dd377103f5e2a8b0a3ad0cff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "internal.h"

rune
io·getr(io·Header *io)
{
    int c, i;
    rune r;
    char buf[UTFmax];

    c = io·getc(io);
    if(utf8·onebyte(c)){
        io->runesz = 1;
        return c;
    }
    buf[0] = c;

    for(i=1;;){
        if((c = io·getc(io))<0)
            return c;

        buf[i++] = c;
        if(utf8·fullrune(buf, i)){
            io->runesz = utf8·decode(buf, &r);
            while(i-- > io->runesz)
                io·ungetc(io);
            return r;
        }
    }
}