summaryrefslogtreecommitdiffstats
path: root/src/rccstring.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rccstring.c')
-rw-r--r--src/rccstring.c39
1 files changed, 36 insertions, 3 deletions
diff --git a/src/rccstring.c b/src/rccstring.c
index 0df20d6..f1f7016 100644
--- a/src/rccstring.c
+++ b/src/rccstring.c
@@ -6,8 +6,8 @@
rcc_string rccCreateString(rcc_language_id language_id, const char *buf, size_t len, size_t *rlen) {
char *res;
- rcc_string_header header = {RCC_STRING_MAGIC, language_id};
-
+ rcc_string_header *header;
+
len = STRNLEN(buf, len);
res = (char*)malloc(len+sizeof(rcc_string_header)+1);
@@ -16,12 +16,45 @@ rcc_string rccCreateString(rcc_language_id language_id, const char *buf, size_t
strncpy(res + sizeof(rcc_string_header), buf, len);
res[sizeof(rcc_string_header) + len] = 0;
- memcpy(res, &header, sizeof(rcc_string_header));
+ memset(res, 0xFF, sizeof(rcc_string_header));
+ header = (rcc_string_header*)res;
+ header->magic = RCC_STRING_MAGIC;
+ header->language_id = language_id;
if (rlen) *rlen = len + sizeof(rcc_string_header);
return (rcc_string)res;
}
+int rccStringSetLang(rcc_string string, const char *sn) {
+ if ((!string)||(!sn)||(strlen(sn)!=2)) return -1;
+ memcpy(&((rcc_string_header*)string)->language,sn,2);
+ return 0;
+}
+
+int rccStringFixID(rcc_string string, rcc_context ctx) {
+ char lang[3];
+ const char *curlang;
+ rcc_language_config config;
+ rcc_language_id language_id;
+ rcc_string_header *header;
+
+ if ((!string)||(!ctx)||(!rccStringCheck(string))) return -1;
+ header = (rcc_string_header*)string;
+
+
+ memcpy(lang, header->language, 2); lang[3] = 0;
+ curlang = rccGetLanguageName(ctx, header->language_id);
+ if ((curlang)&&(!strcasecmp(lang, curlang))) return 0;
+
+ language_id = rccGetLanguageByName(ctx, lang);
+ if ((language_id == (rcc_language_id)-1)||(language_id == 0)) return -1;
+ config = rccGetLanguageConfig(ctx, language_id);
+ if (!config) return -1;
+
+ header->language_id = language_id;
+ return 0;
+}
+
void rccStringFree(rcc_string str) {
if (str) free(str);
}