Add own strtok implementation that has defined behaviour and use that for tokenizers
This commit is contained in:
parent
86f6dbe43f
commit
623d4af43a
19
src/misc.c
19
src/misc.c
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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++;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Reference in New Issue