/rusxmms/librcc

To get this branch, use:
bzr branch http://suren.me/webbzr/rusxmms/librcc

« back to all changes in this revision

Viewing changes to src/string.c

  • Committer: Suren A. Chilingaryan
  • Date: 2005-06-16 23:14:30 UTC
  • Revision ID: Arch-1:ds@dside.dyndns.org--darksoft-2004%librcc--main--0.1--base-0
Initial Import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <stdio.h>
 
2
#include <string.h>
 
3
 
 
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};
 
6
 
 
7
    len = STRNLEN(buf, len);
 
8
        
 
9
    res = (char*)malloc(len+sizeof(rcc_string_header)+1);
 
10
    if (!res) return NULL;
 
11
 
 
12
    strncpy(res + sizeof(rcc_string_header), buf, len);
 
13
    res[sizeof(rcc_string_header) + 1 + len] = 0;
 
14
 
 
15
    memcpy(res, &header, sizeof(rcc_string_header));
 
16
 
 
17
    if (rlen) *rlen = len + sizeof(rcc_string_header);
 
18
    return (rcc_string)res;
 
19
}
 
20
 
 
21
void rccStringFree(rcc_string str) {
 
22
    if (str) free(str);
 
23
}
 
24
 
 
25
rcc_language_id rccStringCheck(const rcc_string str) {
 
26
    int len;
 
27
    rcc_string_header *header;
 
28
 
 
29
    len = strlen(str);
 
30
    
 
31
    if ((!str)||(len<=sizeof(unsigned int))||(*((unsigned int*)(str))!=RCC_STRING_MAGIC)) return 0;
 
32
 
 
33
    header = (rcc_string_header*)(str);
 
34
    return header->language_id;
 
35
}
 
36
 
 
37
const char *rccStringGet(const rcc_string str) {
 
38
    if (rccStringCheck(str)) return str + sizeof(rcc_string_header);
 
39
    return (const char *)str;
 
40
}
 
41
 
 
42
char *rccStringExtract(const rcc_string buf, int len, int *rlen) {
 
43
    char *res;
 
44
    
 
45
    len = STRNLEN(buf, len) - sizeof(rcc_string_header);
 
46
    if (len<0) return NULL;
 
47
    
 
48
    res = (char*)malloc(len+1);
 
49
    if (!res) return NULL;
 
50
 
 
51
    strncpy(res, buf + sizeof(rcc_string_header), len);
 
52
    res[len] = 0;
 
53
    
 
54
    if (rlen) *rlen = len;
 
55
    
 
56
    return res;    
 
57
}
 
58
 
 
59
char *rccStringCmp(const rcc_string str1, const rcc_string str2) {
 
60
    return strcmp(rccStringGet(str1), rccStringGet(str2));
 
61
}
 
62
 
 
63
char *rccStringNCmp(const rcc_string str1, const rcc_string str2, size_t n) {
 
64
    return strncmp(rccStringGet(str1), rccStringGet(str2), n);
 
65
}
 
66
 
 
67
char *rccStringCaseCmp(const rcc_string str1, const rcc_string str2) {
 
68
    return strcasecmp(rccStringGet(str1), rccStringGet(str2));
 
69
}
 
70
 
 
71
char *rccStringNCaseCmp(const rcc_string str1, const rcc_string str2, size_t n) {
 
72
    return strncasecmp(rccStringGet(str1), rccStringGet(str2), n);
 
73
}
 
74