Source code for include/split.h
#ifndef _SPLIT_H_
#define _SPLIT_H_
#define DEFAULT_BUFFER_SIZE 8
#include "types.h"
#include "xalloc.h"
#include <string.h>
struct split_t split(char *target_str, char *delimiters);
void free_split(struct split_t *split_ptr);
bool free_split_r(struct split_t *p, bool ret);
[docs]/**
* Basically it splits dynamically given string.
*
* Args:
* target_str(char *): target string to be splitted
* delimiters(char *): list of delimiter characters as a char pointer
*
* Returns:
* splitted results as a :class:`struct split_t` type
*/
struct split_t split(char *target_str, char *delimiters) {
struct split_t ret = {0, NULL};
size_t buffer_size = DEFAULT_BUFFER_SIZE;
size_t temp = 0;
ret.tokens = (char **)xcalloc(buffer_size, sizeof(char *));
while (true) {
target_str += strspn(target_str, delimiters);
temp = strcspn(target_str, delimiters);
if (!temp)
break;
if (ret.length >= buffer_size) {
buffer_size += DEFAULT_BUFFER_SIZE;
ret.tokens = (char **)xrealloc(ret.tokens, buffer_size * sizeof(char *));
}
ret.tokens[ret.length] = strndup(target_str, temp);
ret.length++;
target_str += temp;
}
return ret;
}
[docs]/**
* Deallocate any type of :class:`struct split_t` object.
*
* Args:
* split_ptr(struct split_t *): target address of split_t object
*/
void free_split(struct split_t *split_ptr) {
for (size_t i = 0; i < split_ptr->length; i++) {
free(split_ptr->tokens[i]);
split_ptr->tokens[i] = NULL;
}
free(split_ptr->tokens);
split_ptr->tokens = NULL;
split_ptr->length = 0;
}
[docs]/**
* Reentrant function for free_split. The `_r` indicates
* that. Basically it frees given split_t pointer address
* (uses ``free_split``) and returns given return value.
*
* Args:
* ptr(struct split_t *): target address of split_t object
* ret(bool): return value as a bool
*
* Returns:
* directly given ret value
*/
bool free_split_r(struct split_t *ptr, bool ret) {
free_split(ptr);
return ret;
}
#endif