aboutsummaryrefslogtreecommitdiff
path: root/src/base/io/getr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/io/getr.c')
-rw-r--r--src/base/io/getr.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/base/io/getr.c b/src/base/io/getr.c
new file mode 100644
index 0000000..01b0f45
--- /dev/null
+++ b/src/base/io/getr.c
@@ -0,0 +1,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;
+ }
+ }
+}