4
rcc_string rccStringInit(rcc_language_id language_id, const char *buf, int len, int *rlen) {
5
rcc_string_header header = {RCC_STRING_MAGIC, language_id};
7
len = STRNLEN(buf, len);
9
res = (char*)malloc(len+sizeof(rcc_string_header)+1);
10
if (!res) return NULL;
12
strncpy(res + sizeof(rcc_string_header), buf, len);
13
res[sizeof(rcc_string_header) + 1 + len] = 0;
15
memcpy(res, &header, sizeof(rcc_string_header));
17
if (rlen) *rlen = len + sizeof(rcc_string_header);
18
return (rcc_string)res;
21
void rccStringFree(rcc_string str) {
25
rcc_language_id rccStringCheck(const rcc_string str) {
27
rcc_string_header *header;
31
if ((!str)||(len<=sizeof(unsigned int))||(*((unsigned int*)(str))!=RCC_STRING_MAGIC)) return 0;
33
header = (rcc_string_header*)(str);
34
return header->language_id;
37
const char *rccStringGet(const rcc_string str) {
38
if (rccStringCheck(str)) return str + sizeof(rcc_string_header);
39
return (const char *)str;
42
char *rccStringExtract(const rcc_string buf, int len, int *rlen) {
45
len = STRNLEN(buf, len) - sizeof(rcc_string_header);
46
if (len<0) return NULL;
48
res = (char*)malloc(len+1);
49
if (!res) return NULL;
51
strncpy(res, buf + sizeof(rcc_string_header), len);
54
if (rlen) *rlen = len;
59
char *rccStringCmp(const rcc_string str1, const rcc_string str2) {
60
return strcmp(rccStringGet(str1), rccStringGet(str2));
63
char *rccStringNCmp(const rcc_string str1, const rcc_string str2, size_t n) {
64
return strncmp(rccStringGet(str1), rccStringGet(str2), n);
67
char *rccStringCaseCmp(const rcc_string str1, const rcc_string str2) {
68
return strcasecmp(rccStringGet(str1), rccStringGet(str2));
71
char *rccStringNCaseCmp(const rcc_string str1, const rcc_string str2, size_t n) {
72
return strncasecmp(rccStringGet(str1), rccStringGet(str2), n);