strtok içeriğinde static değişken tutan bir fonksiyondur. Tehlikelidir. Multiprocess bir sistemde patlaması olasıdır. Bunun için strtok un temelinde şöyle bir değişiklikle kod yazmıştım.
Basitçe bulduğu özel karakterlerin yerini 0 yerleştirip, tüm stringlerin başını kendisine geçilen parsed_list in içine geçiyor.
static inline uint8_t look_for_perpetrator(char character,
char *perpetrator_char_list)
{
uint16_t i, searcher_len;
searcher_len = strlen(perpetrator_char_list);
for (i = 0; i < searcher_len; i++) {
if (character == perpetrator_char_list[i])
return TRUE;
}
return FALSE;
}
#define MAX_NUM_OF_CUSTOM_STRTOK_STRING 20
uint32_t util_strtok(char *victim_string, char *perpetrator_char_list,
char **parsed_list, uint32_t max_num_of_parsing)
{
uint16_t i, j = 0;
uint16_t victim_str_len;
victim_str_len = strlen(victim_string) + 1;
for (i = 0; i < victim_str_len; i++) {
if (look_for_perpetrator(victim_string[i], perpetrator_char_list))
victim_string[i] = 0;
}
for (i = 0; i < victim_str_len; i++) {
if (j >= max_num_of_parsing)
return j;
if (victim_string[i] != 0) {
parsed_list[j++] = &victim_string[i];
i += strlen(&victim_string[i]);
}
}
return j;
}
void text_test()
{
char *parsed_str_list[10] = {0};
char parser_char_list[] = "[,]";
char test[] = "[abc,as,";
uint32_t parse_cnt;
parse_cnt = util_strtok(test, parser_char_list, parsed_str_list, 10);
/*Islem Sonu: 0abc0as*/
}