Switch to using wchar_t instead of Rune. - sam - An updated version of the sam … | |
git clone git://vernunftzentrum.de/sam.git | |
Log | |
Files | |
Refs | |
LICENSE | |
--- | |
commit 5482032dce9b0f38b192198665de4c9beb14b52e | |
parent df3e7c46eae5620b6f3ab7fb5e3cdf02edeae541 | |
Author: Rob King <[email protected]> | |
Date: Mon, 3 Oct 2016 21:53:36 -0500 | |
Switch to using wchar_t instead of Rune. | |
Diffstat: | |
include/libc.h | 2 +- | |
include/u.h | 1 + | |
sam/io.c | 47 +++++++++---------------------- | |
sam/mesg.c | 96 ++++++++++++++++---------------- | |
sam/mesg.h | 2 +- | |
sam/string.c | 16 ++++++++-------- | |
6 files changed, 73 insertions(+), 91 deletions(-) | |
--- | |
diff --git a/include/libc.h b/include/libc.h | |
@@ -6,7 +6,7 @@ | |
#include <u.h> | |
#define utflen(s) (mbstowcs(NULL, (s), 0)) | |
-#define fullrune(s, n) (mbtowc(NULL, (s), (n))) /* >0 */ | |
+#define fullrune(s, n) (mbtowc(NULL, (s), (n)) >= 0) | |
#define runetochar(s, r) (wctomb((s), (r))) | |
#define runelen(r) (wctomb(NULL, (r))) | |
diff --git a/include/u.h b/include/u.h | |
@@ -1,4 +1,5 @@ | |
#include <fcntl.h> | |
+#include <inttypes.h> | |
#include <limits.h> | |
#include <locale.h> | |
#include <stdbool.h> | |
diff --git a/sam/io.c b/sam/io.c | |
@@ -73,47 +73,28 @@ writef(File *f) | |
Posn | |
readio(File *f, int *nulls, int setdate) | |
{ | |
- int n, b, w; | |
- wchar_t *r; | |
- Posn nt; | |
+ size_t n = 0; | |
+ size_t nt = 0; | |
Posn p = addr.r.p2; | |
uint64_t dev, qid; | |
int64_t mtime; | |
char buf[BLOCKSIZE+1] = {0}; | |
- char *s = NULL; | |
+ const char *bp = buf; | |
+ wchar_t wbuf[BLOCKSIZE * MB_LEN_MAX + 1] = {0}; | |
+ mbstate_t ps = {0}; | |
*nulls = FALSE; | |
- b = 0; | |
- for (nt = 0; (n = read(io, buf + b, BLOCKSIZE - b)) > 0; nt += (r - genbuf… | |
- n += b; | |
- b = 0; | |
- r = genbuf; | |
- s = buf; | |
- while (n > 0){ | |
- if (fullrune(s, n)){ | |
- w = chartorune(r, s); | |
- n -= w; | |
- s += w; | |
- continue; | |
- } else{ | |
- if (*r) | |
- *r++ = *s++; | |
- else | |
- *nulls = true; | |
- --n; | |
- } | |
- b = n; | |
- memmove(buf, s, b); | |
- break; | |
- } | |
- Finsert(f, tmprstr(genbuf, r-genbuf), p); | |
- } | |
- if (b) | |
- *nulls = TRUE; | |
+ n = read(io, buf, BLOCKSIZE); | |
+ while (n > 0){ | |
+ size_t w = mbsrtowcs(wbuf, &bp, BLOCKSIZE, &ps); | |
+ Finsert(f, tmprstr(wbuf, w), p); | |
- if (*nulls) | |
- warn(Wnulls); | |
+ memset(buf, 0, sizeof(buf)); | |
+ nt += n; | |
+ n = read(io, buf, BLOCKSIZE); | |
+ bp = buf; | |
+ } | |
if (setdate){ | |
if (statfd(io, &dev, &qid, &mtime, 0, 0) > 0){ | |
diff --git a/sam/mesg.c b/sam/mesg.c | |
@@ -21,57 +21,57 @@ void setgenstr(File*, Posn, Posn); | |
#ifdef DEBUG | |
char *hname[] = { | |
- [Hversion] "Hversion", | |
- [Hbindname] "Hbindname", | |
- [Hcurrent] "Hcurrent", | |
- [Hnewname] "Hnewname", | |
- [Hmovname] "Hmovname", | |
- [Hgrow] "Hgrow", | |
- [Hcheck0] "Hcheck0", | |
- [Hcheck] "Hcheck", | |
- [Hunlock] "Hunlock", | |
- [Hdata] "Hdata", | |
- [Horigin] "Horigin", | |
- [Hunlockfile] "Hunlockfile", | |
- [Hsetdot] "Hsetdot", | |
- [Hgrowdata] "Hgrowdata", | |
- [Hmoveto] "Hmoveto", | |
- [Hclean] "Hclean", | |
- [Hdirty] "Hdirty", | |
- [Hcut] "Hcut", | |
- [Hsetpat] "Hsetpat", | |
- [Hdelname] "Hdelname", | |
- [Hclose] "Hclose", | |
- [Hsetsnarf] "Hsetsnarf", | |
- [Hsnarflen] "Hsnarflen", | |
- [Hack] "Hack", | |
- [Hextcmd] "Hextcmd", | |
- [Hexit] "Hexit", | |
+ [Hversion] = "Hversion", | |
+ [Hbindname] = "Hbindname", | |
+ [Hcurrent] = "Hcurrent", | |
+ [Hnewname] = "Hnewname", | |
+ [Hmovname] = "Hmovname", | |
+ [Hgrow] = "Hgrow", | |
+ [Hcheck0] = "Hcheck0", | |
+ [Hcheck] = "Hcheck", | |
+ [Hunlock] = "Hunlock", | |
+ [Hdata] = "Hdata", | |
+ [Horigin] = "Horigin", | |
+ [Hunlockfile] = "Hunlockfile", | |
+ [Hsetdot] = "Hsetdot", | |
+ [Hgrowdata] = "Hgrowdata", | |
+ [Hmoveto] = "Hmoveto", | |
+ [Hclean] = "Hclean", | |
+ [Hdirty] = "Hdirty", | |
+ [Hcut] = "Hcut", | |
+ [Hsetpat] = "Hsetpat", | |
+ [Hdelname] = "Hdelname", | |
+ [Hclose] = "Hclose", | |
+ [Hsetsnarf] = "Hsetsnarf", | |
+ [Hsnarflen] = "Hsnarflen", | |
+ [Hack] = "Hack", | |
+ [Hextcmd] = "Hextcmd", | |
+ [Hexit] = "Hexit", | |
}; | |
char *tname[] = { | |
- [Tversion] "Tversion", | |
- [Tstartcmdfile] "Tstartcmdfile", | |
- [Tcheck] "Tcheck", | |
- [Trequest] "Trequest", | |
- [Torigin] "Torigin", | |
- [Tstartfile] "Tstartfile", | |
- [Tworkfile] "Tworkfile", | |
- [Ttype] "Ttype", | |
- [Tcut] "Tcut", | |
- [Tpaste] "Tpaste", | |
- [Tsnarf] "Tsnarf", | |
- [Tstartnewfile] "Tstartnewfile", | |
- [Twrite] "Twrite", | |
- [Tclose] "Tclose", | |
- [Tlook] "Tlook", | |
- [Tsearch] "Tsearch", | |
- [Tsend] "Tsend", | |
- [Tdclick] "Tdclick", | |
- [Tstartsnarf] "Tstartsnarf", | |
- [Tsetsnarf] "Tsetsnarf", | |
- [Tack] "Tack", | |
- [Texit] "Texit", | |
+ [Tversion] = "Tversion", | |
+ [Tstartcmdfile] = "Tstartcmdfile", | |
+ [Tcheck] = "Tcheck", | |
+ [Trequest] = "Trequest", | |
+ [Torigin] = "Torigin", | |
+ [Tstartfile] = "Tstartfile", | |
+ [Tworkfile] = "Tworkfile", | |
+ [Ttype] = "Ttype", | |
+ [Tcut] = "Tcut", | |
+ [Tpaste] = "Tpaste", | |
+ [Tsnarf] = "Tsnarf", | |
+ [Tstartnewfile] = "Tstartnewfile", | |
+ [Twrite] = "Twrite", | |
+ [Tclose] = "Tclose", | |
+ [Tlook] = "Tlook", | |
+ [Tsearch] = "Tsearch", | |
+ [Tsend] = "Tsend", | |
+ [Tdclick] = "Tdclick", | |
+ [Tstartsnarf] = "Tstartsnarf", | |
+ [Tsetsnarf] = "Tsetsnarf", | |
+ [Tack] = "Tack", | |
+ [Texit] = "Texit", | |
}; | |
void | |
diff --git a/sam/mesg.h b/sam/mesg.h | |
@@ -1,5 +1,5 @@ | |
/* Copyright (c) 1998 Lucent Technologies - All rights reserved. */ | |
-#define VERSION 16092 | |
+#define VERSION 16091 | |
#define TBLOCKSIZE 512 /* largest piece of text sent… | |
#define DATASIZE (MB_LEN_MAX * TBLOCKSIZE + 30) /* ... including protocol hea… | |
diff --git a/sam/string.c b/sam/string.c | |
@@ -41,9 +41,9 @@ Strzero(String *p) | |
void | |
Strdupl(String *p, wchar_t *s) /* copies the null */ | |
{ | |
- p->n = wcslen(s) + 1; | |
- Strinsure(p, p->n); | |
- memmove(p->s, s, p->n*RUNESIZE); | |
+ p->n = wcslen(s); | |
+ Strinsure(p, p->n + 1); | |
+ wmemmove(p->s, s, p->n); | |
} | |
void | |
@@ -51,7 +51,7 @@ Strduplstr(String *p, String *q) /* will copy the null if … | |
{ | |
Strinsure(p, q->n); | |
p->n = q->n; | |
- memmove(p->s, q->s, q->n*RUNESIZE); | |
+ wmemmove(p->s, q->s, q->n); | |
} | |
void | |
@@ -78,15 +78,15 @@ void | |
Strinsert(String *p, String *q, Posn p0) | |
{ | |
Strinsure(p, p->n+q->n); | |
- memmove(p->s+p0+q->n, p->s+p0, (p->n-p0)*RUNESIZE); | |
- memmove(p->s+p0, q->s, q->n*RUNESIZE); | |
+ wmemmove(p->s + p0 + q->n, p->s + p0, p->n - p0); | |
+ wmemmove(p->s + p0, q->s, q->n); | |
p->n += q->n; | |
} | |
void | |
Strdelete(String *p, Posn p1, Posn p2) | |
{ | |
- memmove(p->s+p1, p->s+p2, (p->n-p2)*RUNESIZE); | |
+ wmemmove(p->s + p1, p->s + p2, p->n - p2); | |
p->n -= p2-p1; | |
} | |
@@ -105,9 +105,9 @@ Strtoc(String *s) | |
memset(ws, 0, sizeof(ws)); | |
memset(c, 0, l + 1); | |
+ wmemcpy(ws, s->s, s->n); | |
ws[s->n] = 0; | |
- swprintf(ws, s->n, L"%ls", s->s); | |
if (wcstombs(c, ws, l) == (size_t)-1) | |
panic("encoding 1"); | |