Blame


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"
12 e830a908 2005-11-06 devnull
13 e830a908 2005-11-06 devnull void
14 e830a908 2005-11-06 devnull cvttorunes(char *p, int n, Rune *r, int *nb, int *nr, int *nulls)
15 e830a908 2005-11-06 devnull {
16 e830a908 2005-11-06 devnull uchar *q;
17 e830a908 2005-11-06 devnull Rune *s;
18 e830a908 2005-11-06 devnull int j, w;
19 e830a908 2005-11-06 devnull
20 e830a908 2005-11-06 devnull /*
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.
26 e830a908 2005-11-06 devnull */
27 e830a908 2005-11-06 devnull q = (uchar*)p;
28 e830a908 2005-11-06 devnull s = r;
29 e830a908 2005-11-06 devnull for(j=0; j<n; j+=w){
30 e830a908 2005-11-06 devnull if(*q < Runeself){
31 e830a908 2005-11-06 devnull w = 1;
32 e830a908 2005-11-06 devnull *s = *q++;
33 e830a908 2005-11-06 devnull }else{
34 e830a908 2005-11-06 devnull w = chartorune(s, (char*)q);
35 e830a908 2005-11-06 devnull q += w;
36 e830a908 2005-11-06 devnull }
37 e830a908 2005-11-06 devnull if(*s)
38 e830a908 2005-11-06 devnull s++;
39 e830a908 2005-11-06 devnull else if(nulls)
40 e830a908 2005-11-06 devnull *nulls = TRUE;
41 e830a908 2005-11-06 devnull }
42 e830a908 2005-11-06 devnull *nb = (char*)q-p;
43 e830a908 2005-11-06 devnull *nr = s-r;
44 e830a908 2005-11-06 devnull }
45 e830a908 2005-11-06 devnull
46 e830a908 2005-11-06 devnull void
47 e830a908 2005-11-06 devnull error(char *s)
48 e830a908 2005-11-06 devnull {
49 e830a908 2005-11-06 devnull fprint(2, "rio: %s: %r\n", s);
50 e830a908 2005-11-06 devnull if(errorshouldabort)
51 e830a908 2005-11-06 devnull abort();
52 e830a908 2005-11-06 devnull threadexitsall("error");
53 e830a908 2005-11-06 devnull }
54 e830a908 2005-11-06 devnull
55 e830a908 2005-11-06 devnull void*
56 e830a908 2005-11-06 devnull erealloc(void *p, uint n)
57 e830a908 2005-11-06 devnull {
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;
62 e830a908 2005-11-06 devnull }
63 e830a908 2005-11-06 devnull
64 e830a908 2005-11-06 devnull void*
65 e830a908 2005-11-06 devnull emalloc(uint n)
66 e830a908 2005-11-06 devnull {
67 e830a908 2005-11-06 devnull void *p;
68 e830a908 2005-11-06 devnull
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;
74 e830a908 2005-11-06 devnull }
75 e830a908 2005-11-06 devnull
76 e830a908 2005-11-06 devnull char*
77 e830a908 2005-11-06 devnull estrdup(char *s)
78 e830a908 2005-11-06 devnull {
79 e830a908 2005-11-06 devnull char *p;
80 e830a908 2005-11-06 devnull
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;
86 e830a908 2005-11-06 devnull }
87 e830a908 2005-11-06 devnull
88 e830a908 2005-11-06 devnull int
89 e830a908 2005-11-06 devnull isalnum(Rune c)
90 e830a908 2005-11-06 devnull {
91 e830a908 2005-11-06 devnull /*
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.
95 e830a908 2005-11-06 devnull */
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;
103 e830a908 2005-11-06 devnull }
104 e830a908 2005-11-06 devnull
105 e830a908 2005-11-06 devnull Rune*
106 e830a908 2005-11-06 devnull strrune(Rune *s, Rune c)
107 e830a908 2005-11-06 devnull {
108 e830a908 2005-11-06 devnull Rune c1;
109 e830a908 2005-11-06 devnull
110 e830a908 2005-11-06 devnull if(c == 0) {
111 e830a908 2005-11-06 devnull while(*s++)
112 e830a908 2005-11-06 devnull ;
113 e830a908 2005-11-06 devnull return s-1;
114 e830a908 2005-11-06 devnull }
115 e830a908 2005-11-06 devnull
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;
120 e830a908 2005-11-06 devnull }
121 e830a908 2005-11-06 devnull
122 e830a908 2005-11-06 devnull int
123 e830a908 2005-11-06 devnull min(int a, int b)
124 e830a908 2005-11-06 devnull {
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;
128 e830a908 2005-11-06 devnull }
129 e830a908 2005-11-06 devnull
130 e830a908 2005-11-06 devnull int
131 e830a908 2005-11-06 devnull max(int a, int b)
132 e830a908 2005-11-06 devnull {
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;
136 e830a908 2005-11-06 devnull }
137 e830a908 2005-11-06 devnull
138 e830a908 2005-11-06 devnull char*
139 e830a908 2005-11-06 devnull runetobyte(Rune *r, int n, int *ip)
140 e830a908 2005-11-06 devnull {
141 e830a908 2005-11-06 devnull char *s;
142 e830a908 2005-11-06 devnull int m;
143 e830a908 2005-11-06 devnull
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;
148 e830a908 2005-11-06 devnull }