17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier #include <thread.h>
57dd7cddfSDavid du Colombier #include <cursor.h>
67dd7cddfSDavid du Colombier #include <mouse.h>
77dd7cddfSDavid du Colombier #include <keyboard.h>
87dd7cddfSDavid du Colombier #include <frame.h>
97dd7cddfSDavid du Colombier #include <fcall.h>
107dd7cddfSDavid du Colombier #include "dat.h"
117dd7cddfSDavid du Colombier #include "fns.h"
127dd7cddfSDavid du Colombier
137dd7cddfSDavid du Colombier void
cvttorunes(char * p,int n,Rune * r,int * nb,int * nr,int * nulls)147dd7cddfSDavid du Colombier cvttorunes(char *p, int n, Rune *r, int *nb, int *nr, int *nulls)
157dd7cddfSDavid du Colombier {
167dd7cddfSDavid du Colombier uchar *q;
177dd7cddfSDavid du Colombier Rune *s;
187dd7cddfSDavid du Colombier int j, w;
197dd7cddfSDavid du Colombier
207dd7cddfSDavid du Colombier /*
217dd7cddfSDavid du Colombier * Always guaranteed that n bytes may be interpreted
227dd7cddfSDavid du Colombier * without worrying about partial runes. This may mean
237dd7cddfSDavid du Colombier * reading up to UTFmax-1 more bytes than n; the caller
247dd7cddfSDavid du Colombier * knows this. If n is a firm limit, the caller should
257dd7cddfSDavid du Colombier * set p[n] = 0.
267dd7cddfSDavid du Colombier */
277dd7cddfSDavid du Colombier q = (uchar*)p;
287dd7cddfSDavid du Colombier s = r;
297dd7cddfSDavid du Colombier for(j=0; j<n; j+=w){
307dd7cddfSDavid du Colombier if(*q < Runeself){
317dd7cddfSDavid du Colombier w = 1;
327dd7cddfSDavid du Colombier *s = *q++;
337dd7cddfSDavid du Colombier }else{
347dd7cddfSDavid du Colombier w = chartorune(s, (char*)q);
357dd7cddfSDavid du Colombier q += w;
367dd7cddfSDavid du Colombier }
377dd7cddfSDavid du Colombier if(*s)
387dd7cddfSDavid du Colombier s++;
397dd7cddfSDavid du Colombier else if(nulls)
407dd7cddfSDavid du Colombier *nulls = TRUE;
417dd7cddfSDavid du Colombier }
427dd7cddfSDavid du Colombier *nb = (char*)q-p;
437dd7cddfSDavid du Colombier *nr = s-r;
447dd7cddfSDavid du Colombier }
457dd7cddfSDavid du Colombier
467dd7cddfSDavid du Colombier void
error(char * s)477dd7cddfSDavid du Colombier error(char *s)
487dd7cddfSDavid du Colombier {
49*9a747e4fSDavid du Colombier fprint(2, "rio: %s: %r\n", s);
507dd7cddfSDavid du Colombier if(errorshouldabort)
517dd7cddfSDavid du Colombier abort();
5259cc4ca5SDavid du Colombier threadexitsall("error");
537dd7cddfSDavid du Colombier }
547dd7cddfSDavid du Colombier
557dd7cddfSDavid du Colombier void*
erealloc(void * p,uint n)567dd7cddfSDavid du Colombier erealloc(void *p, uint n)
577dd7cddfSDavid du Colombier {
587dd7cddfSDavid du Colombier p = realloc(p, n);
597dd7cddfSDavid du Colombier if(p == nil)
607dd7cddfSDavid du Colombier error("realloc failed");
617dd7cddfSDavid du Colombier return p;
627dd7cddfSDavid du Colombier }
637dd7cddfSDavid du Colombier
647dd7cddfSDavid du Colombier void*
emalloc(uint n)657dd7cddfSDavid du Colombier emalloc(uint n)
667dd7cddfSDavid du Colombier {
677dd7cddfSDavid du Colombier void *p;
687dd7cddfSDavid du Colombier
697dd7cddfSDavid du Colombier p = malloc(n);
707dd7cddfSDavid du Colombier if(p == nil)
717dd7cddfSDavid du Colombier error("malloc failed");
727dd7cddfSDavid du Colombier memset(p, 0, n);
737dd7cddfSDavid du Colombier return p;
747dd7cddfSDavid du Colombier }
757dd7cddfSDavid du Colombier
767dd7cddfSDavid du Colombier char*
estrdup(char * s)777dd7cddfSDavid du Colombier estrdup(char *s)
787dd7cddfSDavid du Colombier {
797dd7cddfSDavid du Colombier char *p;
807dd7cddfSDavid du Colombier
817dd7cddfSDavid du Colombier p = malloc(strlen(s)+1);
827dd7cddfSDavid du Colombier if(p == nil)
837dd7cddfSDavid du Colombier error("strdup failed");
847dd7cddfSDavid du Colombier strcpy(p, s);
857dd7cddfSDavid du Colombier return p;
867dd7cddfSDavid du Colombier }
877dd7cddfSDavid du Colombier
887dd7cddfSDavid du Colombier int
isalnum(Rune c)897dd7cddfSDavid du Colombier isalnum(Rune c)
907dd7cddfSDavid du Colombier {
917dd7cddfSDavid du Colombier /*
927dd7cddfSDavid du Colombier * Hard to get absolutely right. Use what we know about ASCII
937dd7cddfSDavid du Colombier * and assume anything above the Latin control characters is
947dd7cddfSDavid du Colombier * potentially an alphanumeric.
957dd7cddfSDavid du Colombier */
967dd7cddfSDavid du Colombier if(c <= ' ')
977dd7cddfSDavid du Colombier return FALSE;
987dd7cddfSDavid du Colombier if(0x7F<=c && c<=0xA0)
997dd7cddfSDavid du Colombier return FALSE;
1007dd7cddfSDavid du Colombier if(utfrune("!\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~", c))
1017dd7cddfSDavid du Colombier return FALSE;
1027dd7cddfSDavid du Colombier return TRUE;
1037dd7cddfSDavid du Colombier }
1047dd7cddfSDavid du Colombier
1057dd7cddfSDavid du Colombier Rune*
strrune(Rune * s,Rune c)1067dd7cddfSDavid du Colombier strrune(Rune *s, Rune c)
1077dd7cddfSDavid du Colombier {
1087dd7cddfSDavid du Colombier Rune c1;
1097dd7cddfSDavid du Colombier
1107dd7cddfSDavid du Colombier if(c == 0) {
1117dd7cddfSDavid du Colombier while(*s++)
1127dd7cddfSDavid du Colombier ;
1137dd7cddfSDavid du Colombier return s-1;
1147dd7cddfSDavid du Colombier }
1157dd7cddfSDavid du Colombier
1167dd7cddfSDavid du Colombier while(c1 = *s++)
1177dd7cddfSDavid du Colombier if(c1 == c)
1187dd7cddfSDavid du Colombier return s-1;
1197dd7cddfSDavid du Colombier return nil;
1207dd7cddfSDavid du Colombier }
1217dd7cddfSDavid du Colombier
1227dd7cddfSDavid du Colombier int
min(int a,int b)1237dd7cddfSDavid du Colombier min(int a, int b)
1247dd7cddfSDavid du Colombier {
1257dd7cddfSDavid du Colombier if(a < b)
1267dd7cddfSDavid du Colombier return a;
1277dd7cddfSDavid du Colombier return b;
1287dd7cddfSDavid du Colombier }
1297dd7cddfSDavid du Colombier
1307dd7cddfSDavid du Colombier int
max(int a,int b)1317dd7cddfSDavid du Colombier max(int a, int b)
1327dd7cddfSDavid du Colombier {
1337dd7cddfSDavid du Colombier if(a > b)
1347dd7cddfSDavid du Colombier return a;
1357dd7cddfSDavid du Colombier return b;
1367dd7cddfSDavid du Colombier }
1377dd7cddfSDavid du Colombier
1387dd7cddfSDavid du Colombier char*
runetobyte(Rune * r,int n,int * ip)1397dd7cddfSDavid du Colombier runetobyte(Rune *r, int n, int *ip)
1407dd7cddfSDavid du Colombier {
1417dd7cddfSDavid du Colombier char *s;
1427dd7cddfSDavid du Colombier int m;
1437dd7cddfSDavid du Colombier
1447dd7cddfSDavid du Colombier s = emalloc(n*UTFmax+1);
1457dd7cddfSDavid du Colombier m = snprint(s, n*UTFmax+1, "%.*S", n, r);
1467dd7cddfSDavid du Colombier *ip = m;
1477dd7cddfSDavid du Colombier return s;
1487dd7cddfSDavid du Colombier }
1497dd7cddfSDavid du Colombier
150