diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-11-03 00:34:35 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-11-03 00:34:35 +0100 |
commit | 9619a621ac8b9be2b38790d21fc5f0c482cd83fa (patch) | |
tree | 53a64676701fbf692c0fb8b6cade6ed21da6a4d5 /sys/src/cmd/rio/rio.c | |
parent | bcad0cd4e631ef321dca17ffa49c8ecdd30cb652 (diff) |
rio: cleanup and error handling
Diffstat (limited to 'sys/src/cmd/rio/rio.c')
-rw-r--r-- | sys/src/cmd/rio/rio.c | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/sys/src/cmd/rio/rio.c b/sys/src/cmd/rio/rio.c index e6537283f..ccf06ab0d 100644 --- a/sys/src/cmd/rio/rio.c +++ b/sys/src/cmd/rio/rio.c @@ -270,24 +270,29 @@ void getsnarf(void) { int i, n, nb, nulls; - char *sn, buf[1024]; + char *s, *sn; if(snarffd < 0) return; sn = nil; i = 0; seek(snarffd, 0, 0); - while((n = read(snarffd, buf, sizeof buf)) > 0){ - sn = erealloc(sn, i+n+1); - memmove(sn+i, buf, n); + for(;;){ + if(i > MAXSNARF) + break; + if((s = realloc(sn, i+1024+1)) == nil) + break; + sn = s; + if((n = read(snarffd, sn+i, 1024)) <= 0) + break; i += n; - sn[i] = 0; } - if(i > 0){ - snarf = runerealloc(snarf, i+1); + if(i == 0) + return; + sn[i] = 0; + if((snarf = runerealloc(snarf, i+1)) != nil) cvttorunes(sn, i, snarf, &nb, &nsnarf, &nulls); - free(sn); - } + free(sn); } void @@ -365,16 +370,15 @@ keyboardsend(char *s, int cnt) if(s[cnt-1] == 0) chanprint(kbdchan, "%s", s); else { - Rune *r; - int i, nb, nr; - - r = runemalloc(cnt); - cvttorunes(s, cnt, r, &nb, &nr, nil); - for(i=0; i<nr; i++){ - if(r[i]) - chanprint(kbdchan, "c%C", r[i]); + Rune r; + int nb; + + nb = 0; + while(fullrune(s+nb, cnt-nb)){ + nb += chartorune(&r, s+nb); + if(r != 0) + chanprint(kbdchan, "c%C", r); } - free(r); } } |