Add own strtok implementation that has defined behaviour and use that for tokenizers

This commit is contained in:
Alex D. 2020-09-01 13:18:07 +02:00
parent 86f6dbe43f
commit 623d4af43a
Signed by: caskd
GPG Key ID: F92BA85F61F4C173
4 changed files with 28 additions and 5 deletions

View File

@ -120,3 +120,22 @@ void skip_spaces(char** addr)
for (; **addr == ' '; (*addr)++) for (; **addr == ' '; (*addr)++)
; ;
} }
char* strtok_mr(char** addr, const char* tokens)
{
if (addr == NULL || *addr == NULL || !**addr || tokens == NULL)
return NULL;
char* save = *addr;
const char* tok = NULL;
do {
if (!**addr)
return save;
for (tok = tokens; *tok; tok++) {
if (**addr == *tok) {
**addr = '\0';
break;
}
}
} while (*(*addr)++);
return save;
}

View File

@ -34,4 +34,5 @@ signed int Ircmd_stoi(char* str);
int safe_strcpy(char** dest, const char* src, size_t lef); int safe_strcpy(char** dest, const char* src, size_t lef);
int safe_charcpy(char** dest, const char c, size_t lef); int safe_charcpy(char** dest, const char c, size_t lef);
void skip_spaces(char** addr); void skip_spaces(char** addr);
char* strtok_mr(char** addr, const char* tokens);
#endif #endif

View File

@ -26,7 +26,7 @@ signed int Tok_mesg(char* str, IRC_Message* out)
#ifdef UIRC_IRCV3 #ifdef UIRC_IRCV3
if (*progr == '@') { if (*progr == '@') {
char* tags; char* tags;
if ((tags = strtok_r(progr, " ", &progr)) != NULL) { if ((tags = strtok_mr(&progr, " ")) != NULL) {
if ((ret = Tok_tags(tags, &out->tags)) < 0) if ((ret = Tok_tags(tags, &out->tags)) < 0)
return ret; return ret;
} else } else
@ -36,7 +36,7 @@ signed int Tok_mesg(char* str, IRC_Message* out)
#endif #endif
if (*progr == ':') { if (*progr == ':') {
char* prefix; char* prefix;
if ((prefix = strtok_r(progr, " ", &progr)) != NULL) { if ((prefix = strtok_mr(&progr, " ")) != NULL) {
if ((ret = Tok_user(prefix, &out->name, false)) < 0) if ((ret = Tok_user(prefix, &out->name, false)) < 0)
return ret; return ret;
} else } else
@ -45,7 +45,7 @@ signed int Tok_mesg(char* str, IRC_Message* out)
skip_spaces(&progr); skip_spaces(&progr);
if ((command = strtok_r(NULL, " ", &progr)) != NULL) { if ((command = strtok_mr(&progr, " ")) != NULL) {
if (!(out->cmd = (isalpha(*command)) ? Ircmd_stoi(command) : atoi(command))) if (!(out->cmd = (isalpha(*command)) ? Ircmd_stoi(command) : atoi(command)))
return ERR_UIRC_UNKNOWN_TOKEN; return ERR_UIRC_UNKNOWN_TOKEN;
} else { } else {
@ -60,7 +60,7 @@ signed int Tok_mesg(char* str, IRC_Message* out)
out->args[i++] = (*progr == ':') ? progr + 1 : progr; out->args[i++] = (*progr == ':') ? progr + 1 : progr;
out->trailing = true; out->trailing = true;
} else { } else {
if ((out->args[i] = strtok_r(NULL, " ", &progr)) == NULL) if ((out->args[i] = strtok_mr(&progr, " ")) == NULL)
return ERR_UIRC_INVALID_FORMAT; return ERR_UIRC_INVALID_FORMAT;
} }
skip_spaces(&progr); skip_spaces(&progr);
@ -88,7 +88,7 @@ signed int Tok_tags(char* str, IRC_Tags* out)
{.name = "reply", .assg = &out->reply}}; {.name = "reply", .assg = &out->reply}};
if (*cpos == '@') if (*cpos == '@')
cpos++; cpos++;
while ((ctag = strtok_r(NULL, "; ", &cpos)) != NULL) { while ((ctag = strtok_mr(&cpos, "; ")) != NULL) {
clientbound = false; clientbound = false;
if (*ctag == '+') { if (*ctag == '+') {
ctag++; ctag++;

View File

@ -7,6 +7,7 @@ add_executable(msgassm msgassm.c)
add_executable(numericmds numericmds.c) add_executable(numericmds numericmds.c)
add_executable(notrail notrail.c) add_executable(notrail notrail.c)
add_executable(spacedargs spacedargs.c) add_executable(spacedargs spacedargs.c)
add_executable(strtokmr strtokmr.c)
target_link_libraries(tokenizer uirc) target_link_libraries(tokenizer uirc)
target_link_libraries(overflow uirc) target_link_libraries(overflow uirc)
@ -15,6 +16,7 @@ target_link_libraries(msgassm uirc)
target_link_libraries(numericmds uirc) target_link_libraries(numericmds uirc)
target_link_libraries(notrail uirc) target_link_libraries(notrail uirc)
target_link_libraries(spacedargs uirc) target_link_libraries(spacedargs uirc)
target_link_libraries(strtokmr uirc)
add_test(NAME Tokenizer COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/tokenizer) add_test(NAME Tokenizer COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/tokenizer)
add_test(NAME Overflow COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/overflow) add_test(NAME Overflow COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/overflow)
@ -23,6 +25,7 @@ add_test(NAME MessageAssembler COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/msgassm
add_test(NAME NumericCmds COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/numericmds) add_test(NAME NumericCmds COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/numericmds)
add_test(NAME IncorrectTrailing COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/notrail) add_test(NAME IncorrectTrailing COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/notrail)
add_test(NAME SpacedArguments COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/spacedargs) add_test(NAME SpacedArguments COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/spacedargs)
add_test(NAME StrTokMoveSave COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/strtokmr)
if ( IRCV3 ) if ( IRCV3 )
add_executable(tagtok tagtok.c) add_executable(tagtok tagtok.c)