diff --git a/CMakeLists.txt b/CMakeLists.txt index 778882f..67cc5ff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,7 @@ set(VERSION "${MAJOR_VERSION}.${MID_VERSION}.${MINOR_VERSION}") project(${PROJ} VERSION ${VERSION} LANGUAGES C) # default flags -set(CMAKE_C_FLAGS "${CFLAGS} -O2") +set(CMAKE_C_FLAGS "${CFLAGS} -O2 -pedantic-errors") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS}") set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -Wextra -Wall -Werror -W") set(CMAKE_COLOR_MAKEFILE ON) diff --git a/locale/ru/LC_MESSAGES/usefull_macros.mo b/locale/ru/LC_MESSAGES/usefull_macros.mo index b302ff2..e0c1c4b 100644 Binary files a/locale/ru/LC_MESSAGES/usefull_macros.mo and b/locale/ru/LC_MESSAGES/usefull_macros.mo differ diff --git a/locale/ru/messages.po b/locale/ru/messages.po index 81f1d4d..f3cd849 100644 --- a/locale/ru/messages.po +++ b/locale/ru/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-06 15:03+0300\n" +"POT-Creation-Date: 2026-03-04 09:05+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -77,79 +77,79 @@ msgstr "" msgid "Can't use multiple args with arg_none!" msgstr "" -#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:267 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:268 #, c-format msgid "double long arguments: --%s" msgstr "" -#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:273 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:274 #, c-format msgid "double short arguments: -%c" msgstr "" -#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:343 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:347 #, c-format msgid "Need argument with %s type\n" msgstr "" #. print only one message -#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:435 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:439 msgid "sl_showhelp(): option index out of range" msgstr "" -#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:441 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:445 #, c-format msgid "Usage: %s [arguments]\n" msgstr "" -#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:528 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:535 #, c-format msgid "Wrong parameter: %s" msgstr "" -#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:532 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:539 #, c-format msgid "%s: need argument!" msgstr "" -#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:536 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:543 #, c-format msgid "Wrong argument \"%s\" of parameter \"%s\"" msgstr "" -#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:147 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:154 msgid "Server disconnected" msgstr "" -#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:434 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:441 msgid "Can't start server handlers thread" msgstr "" -#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:503 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:513 msgid "Limit of connections reached" msgstr "" #. check for RB overflow #. -1 - buffer empty (can't be), -2 - buffer overflow -#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:547 -#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:548 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:557 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:558 #, c-format msgid "Server thread: ring buffer overflow for fd=%d" msgstr "" -#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:562 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:572 #, c-format msgid "Server thread: can't write data to ringbuffer: overflow from fd=%d" msgstr "" #. buffer overflow -#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:574 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:584 #, c-format msgid "Server thread: buffer overflow from fd=%d" msgstr "" #. never reached -#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:664 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:681 #, c-format msgid "Unsupported socket type %d" msgstr "" diff --git a/locale/ru/ru.po b/locale/ru/ru.po index dc054b0..2621218 100644 --- a/locale/ru/ru.po +++ b/locale/ru/ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" - "POT-Creation-Date: 2025-11-06 14:57+0300\n" + "POT-Creation-Date: 2026-03-04 09:01+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -76,80 +76,80 @@ msgstr " msgid "Can't use multiple args with arg_none!" msgstr "Массив параметров не может иметь тип arg_none!" -#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:267 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:268 #, c-format msgid "double long arguments: --%s" msgstr "дублирующийся длинный параметр: --%s" -#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:273 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:274 #, c-format msgid "double short arguments: -%c" msgstr "дублирующийся короткий параметр: -%c" -#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:343 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:347 #, c-format msgid "Need argument with %s type\n" msgstr "Необходим аргумент с типом %s\n" #. print only one message -#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:435 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:439 msgid "sl_showhelp(): option index out of range" msgstr "sl_showhelp(): индекс опции вне допустимого диапазона" -#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:441 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:445 #, c-format msgid "Usage: %s [arguments]\n" msgstr "Использование: %s [аргументы]\n" -#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:528 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:535 #, c-format msgid "Wrong parameter: %s" msgstr "Неправильный параметр: %s" -#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:532 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:539 #, c-format msgid "%s: need argument!" msgstr "%s: необходим аргумент!" -#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:536 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:543 #, c-format msgid "Wrong argument \"%s\" of parameter \"%s\"" msgstr "Неправильный аргумент \"%s\" параметра \"%s\"" -#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:147 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:154 msgid "Server disconnected" msgstr "Сервер отключен" -#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:434 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:441 msgid "Can't start server handlers thread" msgstr "Не могу запустить поток-обработчик сервера" -#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:503 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:513 msgid "Limit of connections reached" msgstr "Достигнут предел соединений" #. check for RB overflow #. -1 - buffer empty (can't be), -2 - buffer overflow -#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:547 -#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:548 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:557 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:558 #, c-format msgid "Server thread: ring buffer overflow for fd=%d" msgstr "Поток сервера: переполнение буфера от fd=%d" -#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:562 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:572 #, c-format msgid "Server thread: can't write data to ringbuffer: overflow from fd=%d" msgstr "Поток сервера: не могу сохранить данные в кольцевом буфере, " "переполнение от fd=%d" #. buffer overflow -#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:574 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:584 #, c-format msgid "Server thread: buffer overflow from fd=%d" msgstr "Поток сервера: переполнение буфера от fd=%d" #. never reached -#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:664 +#: /home/eddy/Docs/SAO/C_diff/snippets_library/socket.c:681 #, c-format msgid "Unsupported socket type %d" msgstr "Неподдерживаемый тип сокета %d" diff --git a/parseargs.c b/parseargs.c index 8e4b7f7..e6d7b10 100644 --- a/parseargs.c +++ b/parseargs.c @@ -191,6 +191,18 @@ void *get_aptr(void *paptr, sl_argtype_e type){ return aptr[i - 1]; } +static int cmpstringp(const void *p1, const void *p2){ + if(!p1 || !p2) return 0; + const char *str1 = * (char * const *) p1, *str2 = * (char * const *) p2; + if(!str1 && !str2) return 0; + else if(!str1) return 1; + else if(!str2) return -1; + return strcmp(str1, str2); +} +static int cmpcharp(const void *p1, const void *p2){ + return (int)(*(char * const)p1 - *(char *const)p2); +} + /** * @brief sl_parseargs_hf - parse arguments with user help funtion * @param argc - amount of arguments @@ -246,17 +258,6 @@ void sl_parseargs_hf(int *argc, char ***argv, sl_option_t *options, void (*helpf } } // sort all lists & check for repeating - int cmpstringp(const void *p1, const void *p2){ - if(!p1 || !p2) return 0; - const char *str1 = * (char * const *) p1, *str2 = * (char * const *) p2; - if(!str1 && !str2) return 0; - else if(!str1) return 1; - else if(!str2) return -1; - return strcmp(str1, str2); - } - int cmpcharp(const void *p1, const void *p2){ - return (int)(*(char * const)p1 - *(char *const)p2); - } qsort(longlist, optsize, sizeof(char *), cmpstringp); qsort(shortlist,optsize, sizeof(char), cmpcharp); char *prevl = longlist[0], prevshrt = shortlist[0]; @@ -336,7 +337,10 @@ void sl_parseargs_hf(int *argc, char ***argv, sl_option_t *options, void (*helpf type = "string"; break; case arg_function: +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpedantic" result = ((sl_argfn_t)aptr)(optarg); +#pragma GCC diagnostic pop break; } if(!result){ @@ -460,6 +464,49 @@ void sl_showhelp(int oindex, sl_option_t *options){ exit(-1); } +static int findsubopt(char *par, sl_suboption_t *so){ + int idx = 0; + if(!par) return -1; + while(so[idx].name){ + if(strcasecmp(par, so[idx].name) == 0) return idx; + ++idx; + } + return -1; // badarg +} +static int opt_setarg(sl_suboption_t *so, int idx, char *val){ + sl_suboption_t *soptr = &so[idx]; + int result = FALSE; + void *aptr = soptr->argptr; + switch(soptr->type){ + default: + case arg_none: + if(soptr->argptr) *((int*)aptr) += 1; // increment value + result = TRUE; + break; + case arg_int: + result = myatoll(aptr, val, arg_int); + break; + case arg_longlong: + result = myatoll(aptr, val, arg_longlong); + break; + case arg_double: + result = myatod(aptr, val, arg_double); + break; + case arg_float: + result = myatod(aptr, val, arg_float); + break; + case arg_string: + result = (*((void**)aptr) = (void*)strdup(val)) != NULL; + break; + case arg_function: +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpedantic" + result = ((sl_argfn_t)aptr)(val); +#pragma GCC diagnostic pop + break; + } + return result; +} /** * @brief sl_get_suboption - get suboptions from parameter string * @param str - parameter string @@ -467,46 +514,6 @@ void sl_showhelp(int oindex, sl_option_t *options){ * @return TRUE if all OK */ int sl_get_suboption(char *str, sl_suboption_t *opt){ - int findsubopt(char *par, sl_suboption_t *so){ - int idx = 0; - if(!par) return -1; - while(so[idx].name){ - if(strcasecmp(par, so[idx].name) == 0) return idx; - ++idx; - } - return -1; // badarg - } - int opt_setarg(sl_suboption_t *so, int idx, char *val){ - sl_suboption_t *soptr = &so[idx]; - int result = FALSE; - void *aptr = soptr->argptr; - switch(soptr->type){ - default: - case arg_none: - if(soptr->argptr) *((int*)aptr) += 1; // increment value - result = TRUE; - break; - case arg_int: - result = myatoll(aptr, val, arg_int); - break; - case arg_longlong: - result = myatoll(aptr, val, arg_longlong); - break; - case arg_double: - result = myatod(aptr, val, arg_double); - break; - case arg_float: - result = myatod(aptr, val, arg_float); - break; - case arg_string: - result = (*((void**)aptr) = (void*)strdup(val)) != NULL; - break; - case arg_function: - result = ((sl_argfn_t)aptr)(val); - break; - } - return result; - } char *tok; int ret = FALSE; char *tmpbuf; diff --git a/socket.c b/socket.c index f1f874c..9b9900a 100644 --- a/socket.c +++ b/socket.c @@ -469,7 +469,9 @@ static void *serverthread(void _U_ *d){ // ZERO - listening server socket poll_set[0].fd = sockfd; poll_set[0].events = POLLIN; - // disconnect client + // disconnect client (no way to make this function non-nested) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpedantic" void disconnect_(sl_sock_t *c, int N){ DBG("Disconnect client \"%s\" (fd=%d)", c->IP, c->fd); if(s->disconnect_handler) s->disconnect_handler(c); @@ -496,6 +498,7 @@ static void *serverthread(void _U_ *d){ pthread_mutex_unlock(&c->mutex); --nfd; } +#pragma GCC diagnostic pop // allocate buffer with size not less than RB size size_t bufsize = s->buffer->length; // as RB should be 1 byte less, this is OK uint8_t *buf = MALLOC(uint8_t, bufsize); diff --git a/usefull_macros.h b/usefull_macros.h index fe99cf9..6172e19 100644 --- a/usefull_macros.h +++ b/usefull_macros.h @@ -453,7 +453,7 @@ typedef struct{ double magick; // -Inf - to distinguish it from sl_sock_*_t int n; // if n < 0 there was no any number in `key` } sl_sock_keyno_t; -#define SL_SOCK_KEYNO_DEFAULT (sl_sock_keyno_t){.magick = -INFINITY, .n = -1} +#define SL_SOCK_KEYNO_DEFAULT {.magick = -INFINITY, .n = -1} void sl_sock_keyno_init(sl_sock_keyno_t*); int sl_sock_keyno_check(sl_sock_keyno_t*);