#include "bbs.h" /* Created by Chia-Kuang Yu, Apr 26th, 2004 */ #define MAX_LANGFILE_SIZE (512 * 1024) #define MAX_STRING_LEN 4096 #define MAX_BUFFER_SIZE (MAX_LANG * MAX_STRING * 20) int parse_hex(unsigned char *buf, unsigned char *ret) { int len = 0; unsigned char table[] = "0123456789ABCDEF"; unsigned char digit[2]; unsigned char *ptr; digit[0] = toupper(*buf); digit[1] = toupper(*(buf + 1)); if ((ptr = strchr(table, digit[0]))) { len++; *ret = (unsigned char)(ptr - table); if ((ptr = strchr(table, digit[1]))) { len++; *ret = *ret * 16 + (unsigned char)(ptr - table); } } return len; } int parse_oct(unsigned char *buf, unsigned char *ret) { int i = 0, length = 0; int ret_val = 0; while(buf[i] >= '0' && buf[i] <= '7' && i < 3) { ret_val = ret_val * 8 + buf[i] - '0'; length++; i++; } if (ret_val > 255) length = 0; else *ret = (unsigned char)ret_val; return length; } unsigned char parse_escape(char *buf, int *length) { unsigned char input[] = "abfnrtv\\?'\""; unsigned char output[] = "\a\b\f\n\r\t\v\\\?\'\""; unsigned char ret = *buf, *ptr; int len = 1; *length = 1; for (ptr = input; *ptr != 0; ptr++) if (*buf == *ptr) return output[ptr - input]; /* hexidecimal number*/ if (*buf == 'x') { len = parse_hex(buf + 1, &ret); *length = len; /* octal number */ } else if(isdigit(*buf)) { len = parse_oct(buf, &ret); *length = len; } return ret; } void load_language(char *filename, char *lang_str[MAX_STRING], int *_offset) { int i, num_string, string_index, filesize; int inside_string, digit, length; char *buf = 0, *start = 0, temp[256]; char escape_sequence; FILE *f; char *p_str_head = SHM->i18nstrbody; int offset = *_offset; sprintf (temp, BBSHOME"/etc/%s", filename); f = fopen(temp, "r"); if (f) { if ((buf = (char *)(malloc(sizeof(char) * MAX_LANGFILE_SIZE)))) { num_string = string_index = 0; memset(lang_str, 0, sizeof(char *) * MAX_STRING); filesize = fread(buf, 1, MAX_LANGFILE_SIZE, f); inside_string = string_index = 0; for (i = 0; i < filesize; i++) { if (isdigit(buf[i]) && inside_string == FALSE) { string_index = string_index * 10 + buf[i] - '0'; digit++; } else if (buf[i] == '"' && inside_string == FALSE) { inside_string = TRUE; start = p_str_head + offset; continue; } else if (inside_string == TRUE && buf[i] == '"' && buf[i -1] == '\\' && buf[i - 2] != '\\') { } else if (i < filesize - 1 && buf[i] == '\\' && buf[i + 1] == '\n') { i++; continue; } else if (buf[i] == '"' && inside_string == TRUE) { inside_string = FALSE; p_str_head[offset] = 0; if (string_index >= 0 && string_index < MAX_STRING) { lang_str[string_index] = start; printf("%d \"%s\"\n", string_index, start); } string_index = 0; offset++; continue; } else if (buf[i] == '\\' && inside_string == TRUE) { escape_sequence = parse_escape(buf + i + 1, &length); if (length) { i += length; buf[i] = escape_sequence; } else i++; } if (inside_string == TRUE) { if (offset < MAX_BUFFER_SIZE) { p_str_head[offset] = buf[i]; offset++; } } } for (i = 0; i < MAX_STRING; i++) if (lang_str[i] == 0) { printf ("DEBUG: %d\n", i); lang_str[i] = p_str_head; } free(buf); printf("%s loaded..\n", temp); fflush(0); } else printf("Warning: out of memory!!\n"); fclose(f); } else { printf ("Warning: %s doesn't exist!!\n", buf); } *_offset = offset; } char *lang_file[] = LANG_FILE; void load_i18nstring() { int i, offset; *SHM->i18nstrbody = 0; offset = 1; for (i = 0; i < MAX_LANG; i++) { load_language(lang_file[i], SHM->i18nstr[i], &offset); } }