X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/0f6fe38cf6a842e638aa35ac7641e1e792634e2c..8ebec7fcaf44fc444596c6bc1df9e71bb45cb2d1:/src/helpfile.c diff --git a/src/helpfile.c b/src/helpfile.c index b46d24a..caee976 100644 --- a/src/helpfile.c +++ b/src/helpfile.c @@ -48,7 +48,7 @@ struct userNode *message_source; struct language *lang_C; struct dict *languages; -static void language_cleanup(void) +static void language_cleanup(UNUSED_ARG(void *extra)) { dict_delete(languages); } @@ -206,7 +206,7 @@ static struct language *language_read(const char *name) /* Read all the translations from the directory. */ while ((dirent = readdir(dir))) { snprintf(filename, sizeof(filename), "languages/%s/%s", name, dirent->d_name); - if (!strcmp(dirent->d_name,"parent")) { + if (!strcmp(dirent->d_name, "parent")) { continue; } else if (!strcmp(dirent->d_name, "strings.db")) { dict = parse_database(filename); @@ -236,6 +236,9 @@ static void language_read_list(void) if (dirent->d_name[0] == '.') continue; snprintf(namebuf, sizeof(namebuf), "languages/%s", dirent->d_name); + if (!strcmp(dirent->d_name, "strings.db")) { + continue; + } if (stat(namebuf, &sbuf) < 0) { log_module(MAIN_LOG, LOG_INFO, "Skipping language entry '%s' (unable to stat).", dirent->d_name); continue; @@ -244,7 +247,8 @@ static void language_read_list(void) log_module(MAIN_LOG, LOG_INFO, "Skipping language entry '%s' (not directory).", dirent->d_name); continue; } - language_alloc(dirent->d_name); + if (!dict_find(languages, dirent->d_name, NULL)) + language_alloc(dirent->d_name); } closedir(dir); } @@ -450,7 +454,7 @@ vsend_message(const char *dest, struct userNode *src, struct handle_info *handle void (*irc_send)(struct userNode *from, const char *to, const char *msg); static struct string_buffer input; unsigned int size, ipos, pos, length, chars_sent, use_color; - unsigned int expand_pos, expand_ipos, newline_ipos; + unsigned int expand_ipos, newline_ipos; char line[MAX_LINE_SIZE]; struct service *service; static char* trigger = NULL; @@ -509,7 +513,7 @@ vsend_message(const char *dest, struct userNode *src, struct handle_info *handle * that requires a very big intermediate buffer. */ expand_ipos = newline_ipos = ipos = 0; - expand_pos = pos = 0; + pos = 0; chars_sent = 0; while (input.list[ipos]) { char ch, *value = NULL, *free_value; @@ -671,7 +675,7 @@ vsend_message(const char *dest, struct userNode *src, struct handle_info *handle break; default: value = ""; - log_module(MAIN_LOG, LOG_ERROR, "Invalid exp.type %d from expansion function %p.", exp.type, expand_f); + log_module(MAIN_LOG, LOG_ERROR, "Invalid exp.type %d from expansion function %p.", exp.type, (void*)expand_f); break; } ipos = name_end - input.list; @@ -726,12 +730,10 @@ vsend_message(const char *dest, struct userNode *src, struct handle_info *handle free(free_value); pos += length; if ((pos < size-1) && input.list[ipos]) { - expand_pos = pos; expand_ipos = ipos; continue; } send_line: - expand_pos = pos; expand_ipos = ipos; SEND_LINE(0); #undef SEND_LINE @@ -745,7 +747,7 @@ send_message(struct userNode *dest, struct userNode *src, const char *format, .. int res; va_list ap; - if (IsLocal(dest)) return 0; + if (IsLocal(dest) && !IsDummy(dest)) return 0; va_start(ap, format); res = vsend_message(dest->nick, src, dest->handle_info, 0, NULL, format, ap); va_end(ap); @@ -757,7 +759,7 @@ send_message_type(int msg_type, struct userNode *dest, struct userNode *src, con int res; va_list ap; - if (IsLocal(dest)) return 0; + if (IsLocal(dest) && !IsDummy(dest)) return 0; va_start(ap, format); res = vsend_message(dest->nick, src, dest->handle_info, msg_type, NULL, format, ap); va_end(ap); @@ -1166,10 +1168,27 @@ void helpfile_init(void) language_read_list(); } -void helpfile_finalize(void) +static void helpfile_read_languages(void) { dict_iterator_t it; + dict_t dict; + + language_read_list(); for (it = dict_first(languages); it; it = iter_next(it)) language_read(iter_key(it)); - reg_exit_func(language_cleanup); + + /* If the user has a strings.db in their languages directory, + * allow that to override C language strings. + */ + dict = parse_database("languages/strings.db"); + if (dict) { + language_set_messages(lang_C, dict); + free_database(dict); + } +} + +void helpfile_finalize(void) +{ + conf_register_reload(helpfile_read_languages); + reg_exit_func(language_cleanup, NULL); }