rathena/src/common/msg_conf.c
Cydh Ramdh c8c40a1377 Follow up 0081e25, 8a723ee (msg_conf stuffs)
- Revert MAP_MAX_MSG to 1500
- Moved some messages to empty spaces
- Added warning message if msg_number is invalid when msg_conf files are being read
- And minor stuffs

Signed-off-by: Cydh Ramdh <house.bad@gmail.com>
2014-04-04 22:28:11 +07:00

136 lines
3.5 KiB
C

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "malloc.h"
#include "msg_conf.h"
#include "showmsg.h"
/*
* Return the message string of the specified number by [Yor]
* (read in table msg_table, with specified lenght table in size)
*/
const char* _msg_txt(int msg_number,int size, char ** msg_table)
{
if (msg_number >= 0 && msg_number < size &&
msg_table[msg_number] != NULL && msg_table[msg_number][0] != '\0')
return msg_table[msg_number];
return "??";
}
/*
* Read txt file and store them into msg_table
*/
int _msg_config_read(const char* cfgName,int size, char ** msg_table)
{
uint16 msg_number, msg_count = 0, line_num = 0;
char line[1024], w1[8], w2[512];
FILE *fp;
static int called = 1;
if ((fp = fopen(cfgName, "r")) == NULL) {
ShowError("Messages file not found: %s\n", cfgName);
return -1;
}
if ((--called) == 0)
memset(msg_table, 0, sizeof (msg_table[0]) * size);
while (fgets(line, sizeof (line), fp)) {
line_num++;
if (line[0] == '/' && line[1] == '/')
continue;
if (sscanf(line, "%7[^:]: %511[^\r\n]", w1, w2) != 2)
continue;
if (strcmpi(w1, "import") == 0)
_msg_config_read(w2,size,msg_table);
else {
msg_number = atoi(w1);
if (msg_number >= 0 && msg_number < size) {
if (msg_table[msg_number] != NULL)
aFree(msg_table[msg_number]);
msg_table[msg_number] = (char *) aMalloc((strlen(w2) + 1) * sizeof (char));
strcpy(msg_table[msg_number], w2);
msg_count++;
}
else
ShowWarning("Invalid message ID '%s' at line %d from '%s' file.\n",w1,line_num,cfgName);
}
}
fclose(fp);
ShowInfo("Done reading "CL_WHITE"'%d'"CL_RESET" messages in "CL_WHITE"'%s'"CL_RESET".\n",msg_count,cfgName);
return 0;
}
/*
* Destroy msg_table (freeup mem)
*/
void _do_final_msg(int size, char ** msg_table){
int i;
for (i = 0; i < size; i++)
aFree(msg_table[i]);
}
/*
* lookup a langtype string into his associate langtype number
* return -1 if not found
*/
int msg_langstr2langtype(char * langtype){
int lang=-1;
if (!strncmpi(langtype, "eng",2)) lang = 0;
else if (!strncmpi(langtype, "rus",2)) lang = 1;
else if (!strncmpi(langtype, "spn",2)) lang = 2;
else if (!strncmpi(langtype, "grm",2)) lang = 3;
else if (!strncmpi(langtype, "chn",2)) lang = 4;
else if (!strncmpi(langtype, "mal",2)) lang = 5;
else if (!strncmpi(langtype, "idn",2)) lang = 6;
else if (!strncmpi(langtype, "frn",2)) lang = 7;
else if (!strncmpi(langtype, "por",2)) lang = 8;
else if (!strncmpi(langtype, "tha",2)) lang = 9;
return lang;
}
/*
* lookup a langtype into his associate lang string
* return ?? if not found
*/
const char* msg_langtype2langstr(int langtype){
switch(langtype){
case 0: return "English (ENG)";
case 1: return "Russkiy (RUS)"; //transliteration
case 2: return "Espanol (SPN)";
case 3: return "Deutsch (GRM)";
case 4: return "Hanyu (CHN)"; //transliteration
case 5: return "Bahasa Malaysia (MAL)";
case 6: return "Bahasa Indonesia (IDN)";
case 7: return "Francais (FRN)";
case 8: return "Portugues Brasileiro (POR)";
case 9: return "Thai (THA)";
default: return "??";
}
}
/*
* verify that the choosen langtype is enable
* return
* 1 : langage enable
* -1 : false range
* -2 : disable
*/
int msg_checklangtype(int lang, bool display){
uint16 test= (1<<(lang-1));
if(!lang) return 1; //default english
else if(lang < 0 || test > LANG_MAX) return -1; //false range
else if (LANG_ENABLE&test) return 1;
else if(display) {
ShowDebug("Unsupported langtype '%d'.\n",lang);
}
return -2;
}