-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathsplit.h
84 lines (71 loc) · 1.99 KB
/
split.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#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);
/**
* 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;
}
/**
* 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;
}
/**
* 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