summaryrefslogtreecommitdiff
path: root/stage3/string.c
blob: ff4bfc30b1e58b7d6cdf08fe4c633d61bc69e438 (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
#include "string.h"

usize find_char(const char *str, char chr)
{
	usize ret = 0;
	while (*str != chr && *str != '\0')
		str++, ret++;
	return ret;
}

u64 parse_num(u8 **str, u8 base, isize size)
{
	u64 x = 0;

	while (size-- != 0) {
		u8 c = **str;

		u64 d;
		if (c >= '0' && c <= '9')
			d = c - '0';
		else if (c >= 'a' && c <= 'z')
			d = c - 'a';
		else if (c >= 'A' && c <= 'z')
			d = c - 'A';
		else
			return x;

		if (d >= base)
			return x;

		(*str)++;
		x = x * base + d;
	}

    return x;
}

usize strlen(const char *str)
{
	return find_char(str, '\0');
}

int strcmp(const char *p1, const char *p2)
{
	while (*p1 == *p2 && *p1 != '\0')
		p1++, p2++;
	return *p1 - *p2;
}

int strncmp(const char *p1, const char *p2, usize size)
{
	for (usize i = 0; i < size; i++)
		if (p1[i] != p2[i])
			return p1[i]-p2[i];
	return 0;
}