summaryrefslogtreecommitdiff
path: root/comp/lucas-standen-NEA/code/tokenizer/util.c
blob: 46deba8151502084058cf962374d108ce84552c7 (plain)
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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <error.h>

void Die(); // brings down the program
void *CheckedMalloc(long size); // malloc checked
void *CheckedRealloc(void *out, long size); // realloc checked
char **Split(char *s, char c); // splits a string into an array of strings around c

void Die(){
	perror("zpy parser");
	exit(errno);
}

void *CheckedMalloc(long size){
	void *out = malloc(size);
	if (out == NULL)
		Die();
	return out;
}

void *CheckedRealloc(void *orig, long size){
	void *out = realloc(orig, size);
	if (out == NULL)
		Die();
	return out;
}

static size_t countSegment(char const *s, char c){
	size_t counter = 0;
	int i = 0;
	while (s[i]){
		if (s[i] == c){
			i++;
			continue;
		}
		counter++;
		while (s[i] && s[i] != c) i++;
	}
	return counter;
}

char **Split(char *s, char c){
	char **strs;
	size_t tab_counter;
	size_t i;
	size_t j;

	if (s == NULL) return NULL;
	tab_counter = countSegment(s, c);
	if ((strs = (char**)CheckedMalloc(sizeof(char*) * (tab_counter + 1))) == NULL) return NULL;
	tab_counter = 0;
	j = -1;
	while (s[++j]) {
		if (s[j] == c) continue;
		i = 0;
		while (s[j + i] && s[j + i] != c) i++;
		if ((strs[tab_counter++] = strndup(&s[j], i)) == NULL) return NULL;
		j += i - 1;
	}
	strs[tab_counter] = NULL;
	return strs;
}