--- README | 2 +- config.mk | 2 +- st.c | 129 +++++--------------------------------------------------------- 3 files changed, 11 insertions(+), 122 deletions(-) diff --git a/README b/README index 25606a2..2bbb859 100644 --- a/README +++ b/README _AT_@ -5,7 +5,7 @@ st is a simple virtual terminal emulator for X which sucks less. Requirements ------------ -In order to build st you need the Xlib header files. +In order to build st you need libutf and the Xlib header files. Installation diff --git a/config.mk b/config.mk index 9431de2..36a0424 100644 --- a/config.mk +++ b/config.mk _AT_@ -14,7 +14,7 @@ X11LIB = /usr/X11R6/lib INCS = -I. -I/usr/include -I${X11INC} \ `pkg-config --cflags fontconfig` \ `pkg-config --cflags freetype2` -LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lutil -lXext -lXft \ +LIBS = -L/usr/lib -lc -lutf -L${X11LIB} -lX11 -lutil -lXext -lXft \ `pkg-config --libs fontconfig` \ `pkg-config --libs freetype2` diff --git a/st.c b/st.c index 8cf3483..da0b6b7 100644 --- a/st.c +++ b/st.c _AT_@ -19,6 +19,7 @@ #include <sys/wait.h> #include <time.h> #include <unistd.h> +#include <utf.h> #include <X11/Xatom.h> #include <X11/Xlib.h> #include <X11/Xutil.h> _AT_@ -394,10 +395,7 @@ static void selcopy(void); static void selscroll(int, int); static void selsnap(int, int *, int *, int); -static int utf8decode(char *, long *); -static int utf8encode(long *, char *); static int utf8size(char *); -static int isfullutf8(char *, int); static ssize_t xwrite(int, char *, size_t); static void *xmalloc(size_t); _AT_@ -506,115 +504,6 @@ xcalloc(size_t nmemb, size_t size) { } int -utf8decode(char *s, long *u) { - uchar c; - int i, n, rtn; - - rtn = 1; - c = *s; - if(~c & B7) { /* 0xxxxxxx */ - *u = c; - return rtn; - } else if((c & (B7|B6|B5)) == (B7|B6)) { /* 110xxxxx */ - *u = c&(B4|B3|B2|B1|B0); - n = 1; - } else if((c & (B7|B6|B5|B4)) == (B7|B6|B5)) { /* 1110xxxx */ - *u = c&(B3|B2|B1|B0); - n = 2; - } else if((c & (B7|B6|B5|B4|B3)) == (B7|B6|B5|B4)) { /* 11110xxx */ - *u = c & (B2|B1|B0); - n = 3; - } else { - goto invalid; - } - - for(i = n, ++s; i > 0; --i, ++rtn, ++s) { - c = *s; - if((c & (B7|B6)) != B7) /* 10xxxxxx */ - goto invalid; - *u <<= 6; - *u |= c & (B5|B4|B3|B2|B1|B0); - } - - if((n == 1 && *u < 0x80) || - (n == 2 && *u < 0x800) || - (n == 3 && *u < 0x10000) || - (*u >= 0xD800 && *u <= 0xDFFF)) { - goto invalid; - } - - return rtn; -invalid: - *u = 0xFFFD; - - return rtn; -} - -int -utf8encode(long *u, char *s) { - uchar *sp; - ulong uc; - int i, n; - - sp = (uchar *)s; - uc = *u; - if(uc < 0x80) { - *sp = uc; /* 0xxxxxxx */ - return 1; - } else if(*u < 0x800) { - *sp = (uc >> 6) | (B7|B6); /* 110xxxxx */ - n = 1; - } else if(uc < 0x10000) { - *sp = (uc >> 12) | (B7|B6|B5); /* 1110xxxx */ - n = 2; - } else if(uc <= 0x10FFFF) { - *sp = (uc >> 18) | (B7|B6|B5|B4); /* 11110xxx */ - n = 3; - } else { - goto invalid; - } - - for(i=n,++sp; i>0; --i,++sp) - *sp = ((uc >> 6*(i-1)) & (B5|B4|B3|B2|B1|B0)) | B7; /* 10xxxxxx */ - - return n+1; -invalid: - /* U+FFFD */ - *s++ = '\xEF'; - *s++ = '\xBF'; - *s = '\xBD'; - - return 3; -} - -/* use this if your buffer is less than UTF_SIZ, it returns 1 if you can decode - UTF-8 otherwise return 0 */ -int -isfullutf8(char *s, int b) { - uchar *c1, *c2, *c3; - - c1 = (uchar *)s; - c2 = (uchar *)++s; - c3 = (uchar *)++s; - if(b < 1) { - return 0; - } else if((*c1&(B7|B6|B5)) == (B7|B6) && b == 1) { - return 0; - } else if((*c1&(B7|B6|B5|B4)) == (B7|B6|B5) && - ((b == 1) || - ((b == 2) && (*c2&(B7|B6)) == B7))) { - return 0; - } else if((*c1&(B7|B6|B5|B4|B3)) == (B7|B6|B5|B4) && - ((b == 1) || - ((b == 2) && (*c2&(B7|B6)) == B7) || - ((b == 3) && (*c2&(B7|B6)) == B7 && (*c3&(B7|B6)) == B7))) { - return 0; - } else { - return 1; - } -} - -int utf8size(char *s) { uchar c = *s; _AT_@ -1230,7 +1119,7 @@ ttyread(void) { char *ptr; char s[UTF_SIZ]; int charsize; /* size of utf8 char in bytes */ - long utf8c; + Rune utf8c; int ret; /* append read bytes to unprocessed bytes */ _AT_@ -1240,9 +1129,9 @@ ttyread(void) { /* process every complete utf8 char */ buflen += ret; ptr = buf; - while(buflen >= UTF_SIZ || isfullutf8(ptr,buflen)) { - charsize = utf8decode(ptr, &utf8c); - utf8encode(&utf8c, s); + while(buflen >= UTF_SIZ || fullrune(ptr, buflen)) { + charsize = chartorune(&utf8c, ptr); + runetochar(s, &utf8c); tputc(s, charsize); ptr += charsize; buflen -= charsize; _AT_@ -2866,7 +2755,7 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { int frp, frcflags; int u8fl, u8fblen, u8cblen, doesexist; char *u8c, *u8fs; - long u8char; + Rune u8char; Font *font = &dc.font; FcResult fcres; FcPattern *fcpattern, *fontpattern; _AT_@ -2982,7 +2871,7 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { u8fl = 0; for(;;) { u8c = s; - u8cblen = utf8decode(s, &u8char); + u8cblen = chartorune(&u8char, s); s += u8cblen; bytelen -= u8cblen; _AT_@ -3354,7 +3243,7 @@ kpress(XEvent *ev) { KeySym ksym; char xstr[31], buf[32], *customkey, *cp = buf; int len, ret; - long c; + Rune c; Status status; Shortcut *bp; _AT_@ -3384,7 +3273,7 @@ kpress(XEvent *ev) { if(IS_SET(MODE_8BIT)) { if(*xstr < 0177) { c = *xstr | B7; - ret = utf8encode(&c, cp); + ret = runetochar(cp, &c); cp += ret; len = 0; } -- 1.7.11.1Received on Mon Sep 17 2001 - 00:00:00 CEST
This archive was generated by hypermail 2.3.0 : Sun May 05 2013 - 16:48:02 CEST