| #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; |
| } |
| |