1 e830a908 2005-11-06 devnull #include <u.h>
2 e830a908 2005-11-06 devnull #include <libc.h>
3 e830a908 2005-11-06 devnull #include <draw.h>
4 e830a908 2005-11-06 devnull #include <thread.h>
5 e830a908 2005-11-06 devnull #include <cursor.h>
6 e830a908 2005-11-06 devnull #include <mouse.h>
7 e830a908 2005-11-06 devnull #include <keyboard.h>
8 e830a908 2005-11-06 devnull #include <frame.h>
9 e830a908 2005-11-06 devnull #include <fcall.h>
10 e830a908 2005-11-06 devnull #include "dat.h"
11 e830a908 2005-11-06 devnull #include "fns.h"
14 e830a908 2005-11-06 devnull cvttorunes(char *p, int n, Rune *r, int *nb, int *nr, int *nulls)
16 e830a908 2005-11-06 devnull uchar *q;
18 e830a908 2005-11-06 devnull int j, w;
21 e830a908 2005-11-06 devnull * Always guaranteed that n bytes may be interpreted
22 e830a908 2005-11-06 devnull * without worrying about partial runes. This may mean
23 e830a908 2005-11-06 devnull * reading up to UTFmax-1 more bytes than n; the caller
24 e830a908 2005-11-06 devnull * knows this. If n is a firm limit, the caller should
25 e830a908 2005-11-06 devnull * set p[n] = 0.
27 e830a908 2005-11-06 devnull q = (uchar*)p;
29 e830a908 2005-11-06 devnull for(j=0; j<n; j+=w){
30 e830a908 2005-11-06 devnull if(*q < Runeself){
32 e830a908 2005-11-06 devnull *s = *q++;
34 e830a908 2005-11-06 devnull w = chartorune(s, (char*)q);
39 e830a908 2005-11-06 devnull else if(nulls)
40 e830a908 2005-11-06 devnull *nulls = TRUE;
42 e830a908 2005-11-06 devnull *nb = (char*)q-p;
43 e830a908 2005-11-06 devnull *nr = s-r;
47 e830a908 2005-11-06 devnull error(char *s)
49 e830a908 2005-11-06 devnull fprint(2, "rio: %s: %r\n", s);
50 e830a908 2005-11-06 devnull if(errorshouldabort)
52 e830a908 2005-11-06 devnull threadexitsall("error");
56 e830a908 2005-11-06 devnull erealloc(void *p, uint n)
58 e830a908 2005-11-06 devnull p = realloc(p, n);
59 e830a908 2005-11-06 devnull if(p == nil)
60 e830a908 2005-11-06 devnull error("realloc failed");
61 e830a908 2005-11-06 devnull return p;
65 e830a908 2005-11-06 devnull emalloc(uint n)
69 e830a908 2005-11-06 devnull p = malloc(n);
70 e830a908 2005-11-06 devnull if(p == nil)
71 e830a908 2005-11-06 devnull error("malloc failed");
72 e830a908 2005-11-06 devnull memset(p, 0, n);
73 e830a908 2005-11-06 devnull return p;
77 e830a908 2005-11-06 devnull estrdup(char *s)
81 e830a908 2005-11-06 devnull p = malloc(strlen(s)+1);
82 e830a908 2005-11-06 devnull if(p == nil)
83 e830a908 2005-11-06 devnull error("strdup failed");
84 e830a908 2005-11-06 devnull strcpy(p, s);
85 e830a908 2005-11-06 devnull return p;
89 e830a908 2005-11-06 devnull isalnum(Rune c)
92 e830a908 2005-11-06 devnull * Hard to get absolutely right. Use what we know about ASCII
93 e830a908 2005-11-06 devnull * and assume anything above the Latin control characters is
94 e830a908 2005-11-06 devnull * potentially an alphanumeric.
96 e830a908 2005-11-06 devnull if(c <= ' ')
97 e830a908 2005-11-06 devnull return FALSE;
98 e830a908 2005-11-06 devnull if(0x7F<=c && c<=0xA0)
99 e830a908 2005-11-06 devnull return FALSE;
100 e830a908 2005-11-06 devnull if(utfrune("!\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~", c))
101 e830a908 2005-11-06 devnull return FALSE;
102 e830a908 2005-11-06 devnull return TRUE;
106 e830a908 2005-11-06 devnull strrune(Rune *s, Rune c)
108 e830a908 2005-11-06 devnull Rune c1;
110 e830a908 2005-11-06 devnull if(c == 0) {
111 e830a908 2005-11-06 devnull while(*s++)
113 e830a908 2005-11-06 devnull return s-1;
116 e830a908 2005-11-06 devnull while(c1 = *s++)
117 e830a908 2005-11-06 devnull if(c1 == c)
118 e830a908 2005-11-06 devnull return s-1;
119 e830a908 2005-11-06 devnull return nil;
123 e830a908 2005-11-06 devnull min(int a, int b)
125 e830a908 2005-11-06 devnull if(a < b)
126 e830a908 2005-11-06 devnull return a;
127 e830a908 2005-11-06 devnull return b;
131 e830a908 2005-11-06 devnull max(int a, int b)
133 e830a908 2005-11-06 devnull if(a > b)
134 e830a908 2005-11-06 devnull return a;
135 e830a908 2005-11-06 devnull return b;
139 e830a908 2005-11-06 devnull runetobyte(Rune *r, int n, int *ip)
141 e830a908 2005-11-06 devnull char *s;
144 e830a908 2005-11-06 devnull s = emalloc(n*UTFmax+1);
145 e830a908 2005-11-06 devnull m = snprint(s, n*UTFmax+1, "%.*S", n, r);
146 e830a908 2005-11-06 devnull *ip = m;
147 e830a908 2005-11-06 devnull return s;