rendered paste bodystatic struct slang_header *slang_find(struct slang_header *, char *);#include "slang_text.c"#include "slang_multitext.c"#include "slang_ids.c"#ifndef SLANG_NOTYPES#include "slang_types.c"#endif#include "slang_duration.c"#ifndef SLANG_NOFACTS#include "slang_facts_places.c"#include "slang_facts.c"#endif#include "slang_chanlang.c"struct slang_header { struct slang_header *next; char *lang; char *desc; struct slang_id *ids;#ifndef SLANG_NOTYPES struct slang_type *types;#endif struct slang_duration *durations;};static void slang_glob_init(){ glob_slang_cmd_list = NULL;}static int slang_glob_expmem(){ return slang_commands_list_expmem(glob_slang_cmd_list);}static void slang_glob_free(){ slang_commands_list_free(glob_slang_cmd_list); glob_slang_cmd_list = NULL;}static struct slang_header *slang_create(struct slang_header *list, char *lang, char *desc){ struct slang_header *nslang, *l; Assert(lang); debug2("Creating language '%s' starting by %d", lang, (int) list); for (nslang = list; nslang; nslang = nslang->next) if (!strcasecmp(nslang->lang, lang)) return list; nslang = nmalloc(sizeof(struct slang_header)); nslang->next = NULL; nslang->desc = NULL; nslang->lang = nmalloc(strlen(lang) + 1); strcpy(nslang->lang, lang); nslang->desc = nmalloc(strlen(desc) + 1); strcpy(nslang->desc, desc); nslang->ids = NULL;#ifndef SLANG_NOTYPES nslang->types = NULL;#endif nslang->durations = NULL; for (l = list; l && l->next; l = l->next); if (l) l->next = nslang; else { Assert(!list); list = nslang; } return list;}static int slang_expmem(struct slang_header *what){ int size = 0; while (what) { size += sizeof(struct slang_header); size += strlen(what->lang) + 1; size += strlen(what->desc) + 1; size += slang_id_expmem(what->ids);#ifndef SLANG_NOTYPES size += slang_type_expmem(what->types);#endif size += slang_duration_expmem(what->durations); what = what->next; } return size;}static void slang_free(struct slang_header *what){ struct slang_header *next; while (what) { next = what->next; slang_id_free(what->ids);#ifndef SLANG_NOTYPES slang_type_free(what->types);#endif slang_duration_free(what->durations); nfree(what->lang); nfree(what->desc); nfree(what); what = next; }}static int slang_load(struct slang_header *slang, char *filename){ FILE *f; char *buffer, *s; char *cmd, *sid, *strtol_ret;#ifndef SLANG_NOTYPES char *type;#endif int line, id; Assert(slang); putlog(LOG_MISC, "*", "Loading language \"%s\" from %s...", slang->lang, filename); f = fopen(filename, "r"); if (!f) { putlog(LOG_MISC, "*", "Couldn't open slangfile \"%s\"!", filename); return 0; } buffer = nmalloc(2000); line = 0; while (!feof(f)) { s = buffer; if (fgets(s, 2000, f)) { line++; // at first, kill those stupid line feeds and carriage returns... if (s[strlen(s) - 1] == '\n') s[strlen(s) - 1] = 0; if (s[strlen(s) - 1] == '\r') s[strlen(s) - 1] = 0; if (!s[0]) continue; cmd = newsplit(&s); if (!strcasecmp(cmd, "T")) {#ifndef SLANG_NOTYPES type = newsplit(&s); slang->types = slang_type_add(slang->types, type, s);#endif } else if (!strcasecmp(cmd, "D")) { sid = newsplit(&s); id = strtol(sid, &strtol_ret, 10); if (strtol_ret == sid) { putlog(LOG_MISC, "*", "ERROR in slangfile \"%s\", line %d: %s is not a valid " "duration index!", filename, line, sid); continue; } slang->durations = slang_duration_add(slang->durations, id, s); } else { id = strtol(cmd, &strtol_ret, 10); if (strtol_ret == cmd) continue; slang->ids = slang_id_add(slang->ids, id, s); } } } fclose(f); nfree(buffer); return 1;}static struct slang_header *slang_find(struct slang_header *where, char *language){ struct slang_header *slang = NULL; // at first, search for the specified language for (slang = where; slang; slang = slang->next) if (!strcasecmp(slang->lang, language)) return slang; // oops... language seems to be invalid. Let's find the default. Assert(default_slang); for (slang = where; slang; slang = slang->next) if (!strcasecmp(slang->lang, default_slang)) return slang; // default_slang wasn't found either? *sigh* // Let's return the first known language then. return where;}#ifndef SLANG_NOVALIDATE/* slang_valid(): * check if the given language is a valid one */static int slang_valid(struct slang_header *where, char *language){ struct slang_header *slang = NULL; for (slang = where; slang; slang = slang->next) if (!strcasecmp(slang->lang, language)) return 1; return 0;}#endifstatic char getslang_error[12];static char *getslang(int id){ char *text; if (!glob_slang) { putlog(LOG_MISC, "*", "WARNING! No language selected! (getslang())"); return "NOLANG"; } text = slang_id_get(glob_slang->ids, id); if (!text) { snprintf(getslang_error, sizeof(getslang_error), "SLANG%d", id); return getslang_error; } return text;}static char *getdur(int idx){ char *text; Assert((idx >= 0) && (idx < DURATIONS)); if (!glob_slang) { putlog(LOG_MISC, "*", "WARNING! No language selected! (getdur())"); return "NOLANG"; } text = slang_duration_get(glob_slang->durations, idx); if (!text) { snprintf(getslang_error, sizeof(getslang_error), "DUR%d", idx); return getslang_error; } return text;}#ifndef SLANG_NOTYPESstatic char *getslangtype(char *type){ char *stype; if (!glob_slang) { putlog(LOG_MISC, "*", "WARNING! No language selected! (getslangtype())"); return "NOLANG"; } stype = slang_type_get(glob_slang->types, type); if (stype) return stype; else return type;}static int slangtypetoi(char *slangtype){ char *type; if (!glob_slang) { putlog(LOG_MISC, "*", "WARNING! No language selected! (slangtypetoi())"); return T_ERROR; } type = slang_type_slang2type(glob_slang->types, slangtype); if (type) { debug1("type: %s", type); return typetoi(type); } else return typetoi(slangtype);}#endif#ifndef SLANG_NOGETALLstatic char *getslang_first(int id){ char *text; if (!glob_slang) { putlog(LOG_MISC, "*", "WARNING! No language selected! (getslang())"); return "NOLANG"; } text = slang_id_get_first(glob_slang->ids, id); if (!text) { snprintf(getslang_error, sizeof(getslang_error), "SLANG%d", id); return getslang_error; } return text;}static char *getslang_next(){ return slang_id_get_next();}#endif