:: limine / common / lib / libc.s2.c 3.0 KB raw

1
#include <stddef.h>
2
#include <stdint.h>
3
#include <lib/libc.h>
4
#include <stdbool.h>
5
#include <lib/misc.h>
6
7
bool isprint(int c) {
8
    return c >= ' ' && c <= '~';
9
}
10
11
bool isspace(int c) {
12
    return (c >= '\t' && c <= 0xD) || c == ' ';
13
}
14
15
bool isalpha(int c) {
16
    return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
17
}
18
19
bool isdigit(int c) {
20
    return c >= '0' && c <= '9';
21
}
22
23
int toupper(int c) {
24
    if (c >= 'a' && c <= 'z') {
25
        return c - 0x20;
26
    }
27
    return c;
28
}
29
30
int tolower(int c) {
31
    if (c >= 'A' && c <= 'Z') {
32
        return c + 0x20;
33
    }
34
    return c;
35
}
36
37
int abs(int i) {
38
    return i < 0 ? -i : i;
39
}
40
41
char *strcpy(char *dest, const char *src) {
42
    size_t i;
43
44
    for (i = 0; src[i]; i++)
45
        dest[i] = src[i];
46
47
    dest[i] = 0;
48
49
    return dest;
50
}
51
52
char *strncpy(char *dest, const char *src, size_t n) {
53
    size_t i;
54
55
    for (i = 0; i < n && src[i]; i++)
56
        dest[i] = src[i];
57
    for ( ; i < n; i++)
58
        dest[i] = 0;
59
60
    return dest;
61
}
62
63
int strcmp(const char *s1, const char *s2) {
64
    for (size_t i = 0; ; i++) {
65
        unsigned char c1 = ((unsigned char *)s1)[i], c2 = ((unsigned char *)s2)[i];
66
        if (c1 != c2) {
67
            return c1 < c2 ? -1 : 1;
68
        }
69
        if (c1 == 0) {
70
            return 0;
71
        }
72
    }
73
}
74
75
int strcasecmp(const char *s1, const char *s2) {
76
    for (size_t i = 0; ; i++) {
77
        unsigned char c1 = ((unsigned char *)s1)[i], c2 = ((unsigned char *)s2)[i];
78
        if (tolower(c1) != tolower(c2)) {
79
            return c1 < c2 ? -1 : 1;
80
        }
81
        if (c1 == 0) {
82
            return 0;
83
        }
84
    }
85
}
86
87
int strncmp(const char *s1, const char *s2, size_t n) {
88
    for (size_t i = 0; i < n; i++) {
89
        unsigned char c1 = ((unsigned char *)s1)[i], c2 = ((unsigned char *)s2)[i];
90
        if (c1 != c2) {
91
            return c1 < c2 ? -1 : 1;
92
        }
93
        if (c1 == 0) {
94
            return 0;
95
        }
96
    }
97
98
    return 0;
99
}
100
101
int strncasecmp(const char *s1, const char *s2, size_t n) {
102
    for (size_t i = 0; i < n; i++) {
103
        unsigned char c1 = ((unsigned char *)s1)[i], c2 = ((unsigned char *)s2)[i];
104
        if (tolower(c1) != tolower(c2)) {
105
            return c1 < c2 ? -1 : 1;
106
        }
107
        if (c1 == 0) {
108
            return 0;
109
        }
110
    }
111
112
    return 0;
113
}
114
115
size_t strlen(const char *str) {
116
    size_t len;
117
118
    for (len = 0; str[len]; len++);
119
120
    return len;
121
}
122
123
int inet_pton(const char *src, void *dst) {
124
    uint8_t array[4];
125
    const char *current = src;
126
127
    for (int i = 0; i < 4; i++) {
128
        const char *newcur;
129
        uint64_t value = strtoui(current, &newcur, 10);
130
        if (current == newcur)
131
            return -1;
132
        current = newcur;
133
        if (i < 3) {
134
            // Expect '.' delimiter between octets
135
            if (*current != '.')
136
                return -1;
137
            current++;
138
        } else {
139
            // After last octet, string must end
140
            if (*current != 0)
141
                return -1;
142
        }
143
        if (value > 255)
144
            return -1;
145
        array[i] = value;
146
    }
147
    memcpy(dst, array, 4);
148
    return 0;
149
}
tab: 248 wrap: offon