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