#include <u.h> | |
#include <libc.h> | |
#include <draw.h> | |
#include <thread.h> | |
#include <cursor.h> | |
#include <mouse.h> | |
#include <keyboard.h> | |
#include <frame.h> | |
#include <fcall.h> | |
#include "dat.h" | |
#include "fns.h" | |
void | |
cvttorunes(char *p, int n, Rune *r, int *nb, int *nr, int *nulls) | |
{ | |
uchar *q; | |
Rune *s; | |
int j, w; | |
/* | |
* Always guaranteed that n bytes may be interpreted | |
* without worrying about partial runes. This may mean | |
* reading up to UTFmax-1 more bytes than n; the caller | |
* knows this. If n is a firm limit, the caller should | |
* set p[n] = 0. | |
*/ | |
q = (uchar*)p; | |
s = r; | |
for(j=0; j<n; j+=w){ | |
if(*q < Runeself){ | |
w = 1; | |
*s = *q++; | |
}else{ | |
w = chartorune(s, (char*)q); | |
q += w; | |
} | |
if(*s) | |
s++; | |
else if(nulls) | |
*nulls = TRUE; | |
} | |
*nb = (char*)q-p; | |
*nr = s-r; | |
} | |
void | |
error(char *s) | |
{ | |
fprint(2, "rio: %s: %r\n", s); | |
if(errorshouldabort) | |
abort(); | |
threadexitsall("error"); | |
} | |
void* | |
erealloc(void *p, uint n) | |
{ | |
p = realloc(p, n); | |
if(p == nil) | |
error("realloc failed"); | |
return p; | |
} | |
void* | |
emalloc(uint n) | |
{ | |
void *p; | |
p = malloc(n); | |
if(p == nil) | |
error("malloc failed"); | |
memset(p, 0, n); | |
return p; | |
} | |
char* | |
estrdup(char *s) | |
{ | |
char *p; | |
p = malloc(strlen(s)+1); | |
if(p == nil) | |
error("strdup failed"); | |
strcpy(p, s); | |
return p; | |
} | |
int | |
isalnum(Rune c) | |
{ | |
/* | |
* Hard to get absolutely right. Use what we know about ASCII | |
* and assume anything above the Latin control characters is | |
* potentially an alphanumeric. | |
*/ | |
if(c <= ' ') | |
return FALSE; | |
if(0x7F<=c && c<=0xA0) | |
return FALSE; | |
if(utfrune("!\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~", c)) | |
return FALSE; | |
return TRUE; | |
} | |
Rune* | |
strrune(Rune *s, Rune c) | |
{ | |
Rune c1; | |
if(c == 0) { | |
while(*s++) | |
; | |
return s-1; | |
} | |
while(c1 = *s++) | |
if(c1 == c) | |
return s-1; | |
return nil; | |
} | |
int | |
min(int a, int b) | |
{ | |
if(a < b) | |
return a; | |
return b; | |
} | |
int | |
max(int a, int b) | |
{ | |
if(a > b) | |
return a; | |
return b; | |
} | |
char* | |
runetobyte(Rune *r, int n, int *ip) | |
{ | |
char *s; | |
int m; | |
s = emalloc(n*UTFmax+1); | |
m = snprint(s, n*UTFmax+1, "%.*S", n, r); | |
*ip = m; | |
return s; | |
} | |