Implemented booleans, swapped to YACJS_NAME macro.
[yacjs.git] / src / yacjs_u8s.c
1 #include <stdlib.h>
2 #include <string.h>
3
4 #include "yacjs_u8s.h"
5
6 U8S_NAME(cptr) U8S_NAME(next)(U8S_NAME(cptr) str) {
7     // non-extended character?
8     if((*str & 0xc0) == 0x0) return str+1;
9     // the annoying case, in the middle of a character
10     if((*str & 0xc0) == 0x80) {
11         while((*str & 0xc0) == 0x80) str ++;
12         return str;
13     }
14     // beginning of extended character. We know what to do!
15     // two-byte?
16     if((*str & 0xe0) == 0xc0) return str+2;
17     // three-byte?
18     if((*str & 0xf0) == 0xe0) return str+3;
19     // four-byte?
20     if((*str & 0xf8) == 0xf0) return str+4;
21     // five-byte?
22     if((*str & 0xfc) == 0xf8) return str+5;
23     // six-byte?
24     if((*str & 0xfe) == 0xfc) return str+6;
25
26     // This should never happen, it's a malformed byte.
27     return str+1;
28 }
29
30 size_t U8S_NAME(strlen)(U8S_NAME(cptr) str) {
31     size_t result = 0;
32     while(*str != 0) {
33         str = U8S_NAME(next)(str);
34         result ++;
35     }
36     return result;
37 }
38
39 size_t U8S_NAME(strlenb)(U8S_NAME(cptr) str) {
40     size_t result = 0;
41     while(*str != 0) str ++, result ++;
42     return result;
43 }
44
45 size_t U8S_NAME(strnlenb)(U8S_NAME(cptr) str, size_t bufsiz) {
46     size_t result = 0;
47     while(*str != 0 && result < bufsiz) str ++, result ++;
48     return result;
49 }
50
51 U8S_NAME(ptr) U8S_NAME(strcpy)(U8S_NAME(ptr) target, U8S_NAME(cptr) src) {
52     do {
53         *(target ++) = *(src ++);
54     } while(*src != 0);
55     *target = 0;
56     return target;
57 }
58
59 U8S_NAME(ptr) U8S_NAME(strncpy)(U8S_NAME(ptr) target, U8S_NAME(cptr) src,
60     size_t bufsiz) {
61
62     size_t used = 0;
63     while(*src != 0) {
64         U8S_NAME(cptr) next = U8S_NAME(next)(src);
65         ptrdiff_t len = next-src;
66         if(used+len >= bufsiz) break;
67         memcpy(target + used, src, len);
68         used += len, src += len;
69     }
70     target[used] = 0;
71     return target;
72 }
73
74 int U8S_NAME(strcmp)(U8S_NAME(cptr) a, U8S_NAME(cptr) b) {
75     return U8S_NAME(strncmp)(a, b, (unsigned)-1);
76 }
77
78 int U8S_NAME(strncmp)(U8S_NAME(cptr) a, U8S_NAME(cptr) b, size_t bufsiz) {
79     return strncmp(a, b, bufsiz);
80 }
81
82 U8S_NAME(ptr) U8S_NAME(strdup)(U8S_NAME(cptr) s) {
83     return U8S_NAME(strcpy)(malloc(U8S_NAME(strlenb(s))), s);
84 }
85
86 U8S_NAME(ptr) U8S_NAME(strndup)(U8S_NAME(cptr) s, size_t bufsiz) {
87     return U8S_NAME(strncpy)(
88         malloc(U8S_NAME(strnlenb)(s, bufsiz)+1),
89         s,
90         bufsiz+1);
91 }