added some code & compiler information to cmd_netinfo
[NeonServV5.git] / lang.c
1 #include "lang.h"
2 #include "UserNode.h"
3 #include "DBHelper.h"
4
5 #define DEFAULT_LANG_TAG "EN"
6 #define DEFAULT_LANG_NAME "English"
7
8 static struct language **langdict;
9 static struct language *lang_c;
10
11 void init_lang() {
12     langdict = calloc(MAXLANGUAGES, sizeof(*langdict));
13 }
14
15 void free_lang() {
16     
17 }
18
19 static struct language* add_language(char *langtag, char *langname) {
20     int cindex;
21     for(cindex = 0; cindex < MAXLANGUAGES; cindex++) {
22         if(langdict[cindex] == NULL) break;
23         if(!strcmp(langdict[cindex]->langname, langname) || !strcmp(langdict[cindex]->langtag, langtag))
24             return langdict[cindex];
25     }
26     if(cindex == MAXLANGUAGES) return NULL;
27     struct language *lang = malloc(sizeof(*lang));
28     if (!lang) {
29         perror("malloc() failed");
30         return NULL;
31     }
32     lang->langtag = strdup(langtag);
33     lang->langname = strdup(langname);
34     struct language_table **entrys = calloc(27, sizeof(*entrys));
35     lang->entrys = entrys;
36     return lang;
37 }
38
39 static int get_entry_index(const char *ident) {
40     const char *underscore = strstr(ident, "_");
41     if(!underscore || !(underscore[1] >= 65 && underscore[1] <= 90)) return 26;
42     return (underscore[1] - 'A');
43 }
44
45 struct language* get_language_by_tag(char *tag) {
46     int cindex;
47     for(cindex = 0; cindex < MAXLANGUAGES; cindex++) {
48         if(langdict[cindex] == NULL) break;
49         if(!strcmp(langdict[cindex]->langtag, tag))
50             return langdict[cindex];
51     }
52     return NULL;
53 }
54
55 struct language* get_language_by_name(char *name) {
56     int cindex;
57     for(cindex = 0; cindex < MAXLANGUAGES; cindex++) {
58         if(langdict[cindex] == NULL) break;
59         if(!strcmp(langdict[cindex]->langname, name))
60             return langdict[cindex];
61     }
62     return NULL;
63 }
64
65 struct language* get_default_language() {
66     if(lang_c == NULL) 
67         lang_c = add_language(DEFAULT_LANG_TAG, DEFAULT_LANG_NAME);
68     return lang_c;
69 }
70
71 void register_default_language_table(const struct default_language_entry *msgtab) {
72     if(lang_c == NULL) 
73         lang_c = add_language(DEFAULT_LANG_TAG, DEFAULT_LANG_NAME);
74     struct language_table *lang_entry;
75     int cindex;
76     while(msgtab->ident) {
77         cindex = get_entry_index(msgtab->ident);
78         lang_entry = malloc(sizeof(*lang_entry));
79         if (!lang_entry) {
80             perror("malloc() failed");
81             return;
82         }
83         lang_entry->ident = strdup(msgtab->ident);
84         lang_entry->text = strdup(msgtab->text);
85         lang_entry->next = lang_c->entrys[cindex];
86         lang_c->entrys[cindex] = lang_entry;
87         msgtab++;
88     }
89 }
90
91 char *get_language_string(struct UserNode *user, const char* msg_ident) {
92     struct language* lang;
93     if((user->flags & USERFLAG_ISAUTHED)) {
94         loadUserSettings(user);
95         lang = user->language;
96     } else
97         lang = lang_c;
98     int cindex = get_entry_index(msg_ident);
99     struct language_table* entry;
100     for(entry = lang->entrys[cindex]; entry; entry = entry->next) {
101         if(!strcmp(entry->ident, msg_ident))
102             return entry->text;
103     }
104     return NULL;
105 }
106
107 char *build_language_string(struct UserNode *user, char *buffer, const char *msg_ident, ...) {
108     char *formatStr = get_language_string(user, msg_ident);
109     if(!formatStr) return NULL;
110     if(buffer == NULL) {
111         buffer = (char *)malloc((MAXLEN+1) * sizeof(char));
112         if (!buffer) {
113             perror("malloc() failed");
114             return NULL;
115         }
116     }
117     int pos;
118     va_list arg_list;
119     buffer[0] = '\0';
120     va_start(arg_list, msg_ident);
121     pos = vsnprintf(buffer, MAXLEN - 2, formatStr, arg_list);
122     va_end(arg_list);
123     if (pos < 0 || pos > (MAXLEN - 2)) pos = MAXLEN - 2;
124     buffer[pos] = '\0';
125     return buffer;
126 }