Blame


1 ed7c8e8d 2003-09-30 devnull #include "sam.h"
2 ed7c8e8d 2003-09-30 devnull
3 ed7c8e8d 2003-09-30 devnull void
4 ed7c8e8d 2003-09-30 devnull cvttorunes(char *p, int n, Rune *r, int *nb, int *nr, int *nulls)
5 ed7c8e8d 2003-09-30 devnull {
6 ed7c8e8d 2003-09-30 devnull uchar *q;
7 ed7c8e8d 2003-09-30 devnull Rune *s;
8 ed7c8e8d 2003-09-30 devnull int j, w;
9 ed7c8e8d 2003-09-30 devnull
10 ed7c8e8d 2003-09-30 devnull /*
11 ed7c8e8d 2003-09-30 devnull * Always guaranteed that n bytes may be interpreted
12 ed7c8e8d 2003-09-30 devnull * without worrying about partial runes. This may mean
13 ed7c8e8d 2003-09-30 devnull * reading up to UTFmax-1 more bytes than n; the caller
14 ed7c8e8d 2003-09-30 devnull * knows this. If n is a firm limit, the caller should
15 ed7c8e8d 2003-09-30 devnull * set p[n] = 0.
16 ed7c8e8d 2003-09-30 devnull */
17 ed7c8e8d 2003-09-30 devnull q = (uchar*)p;
18 ed7c8e8d 2003-09-30 devnull s = r;
19 ed7c8e8d 2003-09-30 devnull for(j=0; j<n; j+=w){
20 ed7c8e8d 2003-09-30 devnull if(*q < Runeself){
21 ed7c8e8d 2003-09-30 devnull w = 1;
22 ed7c8e8d 2003-09-30 devnull *s = *q++;
23 ed7c8e8d 2003-09-30 devnull }else{
24 ed7c8e8d 2003-09-30 devnull w = chartorune(s, (char*)q);
25 ed7c8e8d 2003-09-30 devnull q += w;
26 ed7c8e8d 2003-09-30 devnull }
27 ed7c8e8d 2003-09-30 devnull if(*s)
28 ed7c8e8d 2003-09-30 devnull s++;
29 ed7c8e8d 2003-09-30 devnull else if(nulls)
30 ed7c8e8d 2003-09-30 devnull *nulls = TRUE;
31 ed7c8e8d 2003-09-30 devnull }
32 ed7c8e8d 2003-09-30 devnull *nb = (char*)q-p;
33 ed7c8e8d 2003-09-30 devnull *nr = s-r;
34 ed7c8e8d 2003-09-30 devnull }
35 ed7c8e8d 2003-09-30 devnull
36 ed7c8e8d 2003-09-30 devnull void*
37 ed7c8e8d 2003-09-30 devnull fbufalloc(void)
38 ed7c8e8d 2003-09-30 devnull {
39 ed7c8e8d 2003-09-30 devnull return emalloc(BUFSIZE);
40 ed7c8e8d 2003-09-30 devnull }
41 ed7c8e8d 2003-09-30 devnull
42 ed7c8e8d 2003-09-30 devnull void
43 ed7c8e8d 2003-09-30 devnull fbuffree(void *f)
44 ed7c8e8d 2003-09-30 devnull {
45 ed7c8e8d 2003-09-30 devnull free(f);
46 ed7c8e8d 2003-09-30 devnull }
47 ed7c8e8d 2003-09-30 devnull
48 ed7c8e8d 2003-09-30 devnull uint
49 ed7c8e8d 2003-09-30 devnull min(uint a, uint b)
50 ed7c8e8d 2003-09-30 devnull {
51 ed7c8e8d 2003-09-30 devnull if(a < b)
52 ed7c8e8d 2003-09-30 devnull return a;
53 ed7c8e8d 2003-09-30 devnull return b;
54 ed7c8e8d 2003-09-30 devnull }