ref: a130d441722ac3f759d2d83b98eb6aef7e84f97e
parent: dbe5ea124123547cea539c078130d5b2168a2fd2
author: cinap_lenrek <[email protected]>
date: Mon Aug 2 14:33:28 EDT 2021
gui-win32: delete utf-16 routines, just use WideCharToMultiByte()/MultiByteToWideChar() kernel32 functions
--- a/gui-win32/Makefile
+++ b/gui-win32/Makefile
@@ -4,7 +4,6 @@
OFILES=\
screen.$O\
- r16.$O
default: $(LIB)
$(LIB): $(OFILES)
--- a/gui-win32/r16.c
+++ /dev/null
@@ -1,186 +1,0 @@
-#define _WIN32_WINNT 0x0500
-#include <windows.h>
-
-#include "u.h"
-#include "lib.h"
-#include "r16.h"
-
-#define Bit(i) (7-(i))
-/* N 0's preceded by i 1's, T(Bit(2)) is 1100 0000 */
-#define T(i) (((1 << (Bit(i)+1))-1) ^ 0xFF)
-/* 0000 0000 0000 0111 1111 1111 */
-#define RuneX(i) ((1 << (Bit(i) + ((i)-1)*Bitx))-1)
-
-enum
-{
- Bitx = Bit(1),
-
- Tx = T(1), /* 1000 0000 */
- Rune1 = (1<<(Bit(0)+0*Bitx))-1, /* 0000 0000 0000 0000 0111 1111 */
-
- Maskx = (1<<Bitx)-1, /* 0011 1111 */
- Testx = Maskx ^ 0xFF, /* 1100 0000 */
-
- SurrogateMax = 0xDFFF,
- HiSurrogate = 0xD800,
- LoSurrogate = 0xDC00,
-
- Bad = Runeerror,
-};
-
-Rune16*
-runes16dup(Rune16 *r)
-{
- int n;
- Rune16 *s;
-
- n = runes16len(r) + 1;
- s = calloc(n, sizeof(Rune16));
- memcpy(s, r, n * sizeof(Rune16));
- return s;
-}
-
-int
-runes16len(Rune16 *r)
-{
- int n;
-
- n = 0;
- while(*r++ != 0)
- n++;
- return n;
-}
-
-char*
-runes16toutf(char *p, Rune16 *r, int nc)
-{
- char *op, *ep;
- int n, c;
- Rune rc;
-
- op = p;
- ep = p + nc;
- while(c = *r++){
- n = 1;
- if(c >= Runeself)
- n = runelen(c);
- if(p + n >= ep)
- break;
- if(c < Runeself){
- *p++ = c;
- continue;
- }
- rc = c;
- if(c >= LoSurrogate && c <= SurrogateMax)
- rc = Bad;
- else if(c >= HiSurrogate && c <= 0xDBFF){ /* decode a surrogate pair properly */
- if(p + n+1 >= ep)
- rc = Bad;
- else if((c = *r) >= LoSurrogate && c <= SurrogateMax){
- rc = 0x10000 | (*(r-1) - HiSurrogate) << 10 | (c - LoSurrogate);
- r++;
- }else
- rc = Bad;
- }
- p += runetochar(p, &rc);
- }
- *p = '\0';
- return op;
-}
-
-int
-rune16nlen(Rune16 *r, int nrune)
-{
- int nb, i;
- Rune c;
-
- nb = 0;
- while(nrune--) {
- c = *r++;
- if(c <= Rune1){
- nb++;
- } else {
- for(i = 2; i < UTFmax + 1; i++)
- if(c <= RuneX(i) || i == UTFmax){
- nb += i;
- break;
- }
- }
- }
- return nb;
-}
-
-Rune16*
-utftorunes16(Rune16 *r, char *p, int nc)
-{
- Rune16 *or, *er;
- Rune rc;
-
- or = r;
- er = r + nc;
- while(*p != '\0' && r + 1 < er){
- p += chartorune(&rc, p);
- if(rc >= 0x10000){ /* got to encode it in a surrogate pair */
- rc -= 0x10000;
- *r++ = (rc >> 10)+HiSurrogate;
- *r++ = (rc & 0x3FF)+LoSurrogate;
- }else
- *r++ = rc;
- }
- *r = '\0';
- return or;
-}
-
-int
-runes16cmp(Rune16 *s1, Rune16 *s2)
-{
- Rune16 r1, r2;
-
- for(;;) {
- r1 = *s1++;
- r2 = *s2++;
- if(r1 != r2) {
- if(r1 > r2)
- return 1;
- return -1;
- }
- if(r1 == 0)
- return 0;
- }
-}
-
-wchar_t *
-widen(char *s)
-{
- int n;
- wchar_t *ws;
-
- n = utflen(s) + 1;
- ws = calloc(n, sizeof(wchar_t));
- utftorunes16(ws, s, n);
- return ws;
-}
-
-
-char *
-narrowen(wchar_t *ws)
-{
- char *s;
- int n;
-
- n = widebytes(ws);
- s = malloc(n);
- runes16toutf(s, ws, n);
- return s;
-}
-
-
-int
-widebytes(wchar_t *ws)
-{
- int n = 0;
-
- while(*ws)
- n += runelen(*ws++);
- return n+1;
-}
--- a/gui-win32/r16.h
+++ /dev/null
@@ -1,11 +1,0 @@
-typedef unsigned short Rune16;
-
-wchar_t *widen(char *s);
-char *narrowen(wchar_t *ws);
-int widebytes(wchar_t *ws);
-int runes16len(Rune16*);
-int rune16nlen(Rune16*, int);
-Rune16* runes16dup(Rune16*);
-Rune16* utftorunes16(Rune16*, char*, int);
-char* runes16toutf(char*, Rune16*, int);
-int runes16cmp(Rune16*, Rune16*);
--- a/gui-win32/screen.c
+++ b/gui-win32/screen.c
@@ -14,7 +14,6 @@
#include <memdraw.h>
#include "screen.h"
#include "keyboard.h"
-#include "r16.h"
Memimage *gscreen;
Screeninfo screen;
@@ -557,14 +556,14 @@
char*
clipreadunicode(HANDLE h)
{
- Rune16 *p;
+ wchar_t *p;
int n;
char *q;
p = GlobalLock(h);
- n = rune16nlen(p, runes16len(p)+1);
- q = malloc(n);
- runes16toutf(q, p, n);
+ n = WideCharToMultiByte(CP_UTF8, 0, p, -1, 0, 0, 0, 0);
+ q = malloc(n+1);
+ WideCharToMultiByte(CP_UTF8, 0, p, -1, q, n, 0, 0);
GlobalUnlock(h);
return q;
@@ -642,7 +641,7 @@
{
HANDLE h;
char *p;
- Rune16 *rp;
+ wchar_t *rp;
char *crbuf;
int n;
@@ -659,11 +658,11 @@
crbuf = addcr(buf, &n);
- h = GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE, (n+1)*sizeof(Rune));
+ h = GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE, (n+1)*sizeof(rp[0]));
if(h == NULL)
panic("out of memory");
rp = GlobalLock(h);
- utftorunes16(rp, crbuf, n+1);
+ MultiByteToWideChar(CP_UTF8, 0, crbuf, -1, rp, n+1);
GlobalUnlock(h);
SetClipboardData(CF_UNICODETEXT, h);