Compare commits

..

No commits in common. "609067cefa3685ef813eb6a68f115f173f189fae" and "55c8a1598369d7e3ab0862dc18bae29eaa7ead53" have entirely different histories.

18 changed files with 581 additions and 285 deletions

View File

@ -148,10 +148,6 @@ set(BAN_SOURCES
set(KLIBC_SOURCES set(KLIBC_SOURCES
klibc/ctype.cpp klibc/ctype.cpp
klibc/string.cpp klibc/string.cpp
# Ehhh don't do this but for now libc uses the same stuff kernel can use
# This won't work after libc starts using sse implemetations tho
../userspace/libraries/LibC/arch/${BANAN_ARCH}/string.S
) )
set(LIBFONT_SOURCES set(LIBFONT_SOURCES

View File

@ -186,26 +186,211 @@ isr 29
isr 30 isr 30
isr 31 isr 31
.irp i, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, \ irq 0
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, \ irq 1
20, 21, 22, 23, 24, 25, 26, 27, 28, 29, \ irq 2
30, 31, 32, 33, 34, 35, 36, 37, 38, 39, \ irq 3
40, 41, 42, 43, 44, 45, 46, 47, 48, 49, \ irq 4
50, 51, 52, 53, 54, 55, 56, 57, 58, 59, \ irq 5
60, 61, 62, 63, 64, 65, 66, 67, 68, 69, \ irq 6
70, 71, 72, 73, 74, 75, 76, 77, 78, 79, \ irq 7
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, \ irq 8
90, 91, 92, 93, 94, 95, 96, 97, 98, 99, \ irq 9
100,101,102,103,104,105,106,107,108,109, \ irq 10
110,111,112,113,114,115,116,117,118,119, \ irq 11
120,121,122,123,124,125,126,127,128,129, \ irq 12
130,131,132,133,134,135,136,137,138,139, \ irq 13
140,141,142,143,144,145,146,147,148,149, \ irq 14
150,151,152,153,154,155,156,157,158,159, \ irq 15
160,161,162,163,164,165,166,167,168,169, \ irq 16
170,171,172,173,174,175,176,177,178,179, \ irq 17
180,181,182,183,184,185,186,187,188,189, \ irq 18
190,191,192,193,194,195,196,197,198,199, \ irq 19
200,201,202,203,204,205,206,207 irq 20
irq \i irq 21
.endr irq 22
irq 23
irq 24
irq 25
irq 26
irq 27
irq 28
irq 29
irq 30
irq 31
irq 32
irq 33
irq 34
irq 35
irq 36
irq 37
irq 38
irq 39
irq 40
irq 41
irq 42
irq 43
irq 44
irq 45
irq 46
irq 47
irq 48
irq 49
irq 50
irq 51
irq 52
irq 53
irq 54
irq 55
irq 56
irq 57
irq 58
irq 59
irq 60
irq 61
irq 62
irq 63
irq 64
irq 65
irq 66
irq 67
irq 68
irq 69
irq 70
irq 71
irq 72
irq 73
irq 74
irq 75
irq 76
irq 77
irq 78
irq 79
irq 80
irq 81
irq 82
irq 83
irq 84
irq 85
irq 86
irq 87
irq 88
irq 89
irq 90
irq 91
irq 92
irq 93
irq 94
irq 95
irq 96
irq 97
irq 98
irq 99
irq 100
irq 101
irq 102
irq 103
irq 104
irq 105
irq 106
irq 107
irq 108
irq 109
irq 110
irq 111
irq 112
irq 113
irq 114
irq 115
irq 116
irq 117
irq 118
irq 119
irq 120
irq 121
irq 122
irq 123
irq 124
irq 125
irq 126
irq 127
irq 128
irq 129
irq 130
irq 131
irq 132
irq 133
irq 134
irq 135
irq 136
irq 137
irq 138
irq 139
irq 140
irq 141
irq 142
irq 143
irq 144
irq 145
irq 146
irq 147
irq 148
irq 149
irq 150
irq 151
irq 152
irq 153
irq 154
irq 155
irq 156
irq 157
irq 158
irq 159
irq 160
irq 161
irq 162
irq 163
irq 164
irq 165
irq 166
irq 167
irq 168
irq 169
irq 170
irq 171
irq 172
irq 173
irq 174
irq 175
irq 176
irq 177
irq 178
irq 179
irq 180
irq 181
irq 182
irq 183
irq 184
irq 185
irq 186
irq 187
irq 188
irq 189
irq 190
irq 191
irq 192
irq 193
irq 194
irq 195
irq 196
irq 197
irq 198
irq 199
irq 200
irq 201
irq 202
irq 203
irq 204
irq 205
irq 206
irq 207

View File

@ -140,26 +140,211 @@ isr 29
isr 30 isr 30
isr 31 isr 31
.irp i, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, \ irq 0
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, \ irq 1
20, 21, 22, 23, 24, 25, 26, 27, 28, 29, \ irq 2
30, 31, 32, 33, 34, 35, 36, 37, 38, 39, \ irq 3
40, 41, 42, 43, 44, 45, 46, 47, 48, 49, \ irq 4
50, 51, 52, 53, 54, 55, 56, 57, 58, 59, \ irq 5
60, 61, 62, 63, 64, 65, 66, 67, 68, 69, \ irq 6
70, 71, 72, 73, 74, 75, 76, 77, 78, 79, \ irq 7
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, \ irq 8
90, 91, 92, 93, 94, 95, 96, 97, 98, 99, \ irq 9
100,101,102,103,104,105,106,107,108,109, \ irq 10
110,111,112,113,114,115,116,117,118,119, \ irq 11
120,121,122,123,124,125,126,127,128,129, \ irq 12
130,131,132,133,134,135,136,137,138,139, \ irq 13
140,141,142,143,144,145,146,147,148,149, \ irq 14
150,151,152,153,154,155,156,157,158,159, \ irq 15
160,161,162,163,164,165,166,167,168,169, \ irq 16
170,171,172,173,174,175,176,177,178,179, \ irq 17
180,181,182,183,184,185,186,187,188,189, \ irq 18
190,191,192,193,194,195,196,197,198,199, \ irq 19
200,201,202,203,204,205,206,207 irq 20
irq \i irq 21
.endr irq 22
irq 23
irq 24
irq 25
irq 26
irq 27
irq 28
irq 29
irq 30
irq 31
irq 32
irq 33
irq 34
irq 35
irq 36
irq 37
irq 38
irq 39
irq 40
irq 41
irq 42
irq 43
irq 44
irq 45
irq 46
irq 47
irq 48
irq 49
irq 50
irq 51
irq 52
irq 53
irq 54
irq 55
irq 56
irq 57
irq 58
irq 59
irq 60
irq 61
irq 62
irq 63
irq 64
irq 65
irq 66
irq 67
irq 68
irq 69
irq 70
irq 71
irq 72
irq 73
irq 74
irq 75
irq 76
irq 77
irq 78
irq 79
irq 80
irq 81
irq 82
irq 83
irq 84
irq 85
irq 86
irq 87
irq 88
irq 89
irq 90
irq 91
irq 92
irq 93
irq 94
irq 95
irq 96
irq 97
irq 98
irq 99
irq 100
irq 101
irq 102
irq 103
irq 104
irq 105
irq 106
irq 107
irq 108
irq 109
irq 110
irq 111
irq 112
irq 113
irq 114
irq 115
irq 116
irq 117
irq 118
irq 119
irq 120
irq 121
irq 122
irq 123
irq 124
irq 125
irq 126
irq 127
irq 128
irq 129
irq 130
irq 131
irq 132
irq 133
irq 134
irq 135
irq 136
irq 137
irq 138
irq 139
irq 140
irq 141
irq 142
irq 143
irq 144
irq 145
irq 146
irq 147
irq 148
irq 149
irq 150
irq 151
irq 152
irq 153
irq 154
irq 155
irq 156
irq 157
irq 158
irq 159
irq 160
irq 161
irq 162
irq 163
irq 164
irq 165
irq 166
irq 167
irq 168
irq 169
irq 170
irq 171
irq 172
irq 173
irq 174
irq 175
irq 176
irq 177
irq 178
irq 179
irq 180
irq 181
irq 182
irq 183
irq 184
irq 185
irq 186
irq 187
irq 188
irq 189
irq 190
irq 191
irq 192
irq 193
irq 194
irq 195
irq 196
irq 197
irq 198
irq 199
irq 200
irq 201
irq 202
irq 203
irq 204
irq 205
irq 206
irq 207

View File

@ -278,7 +278,7 @@ namespace Kernel::ACPI::AML
BAN::ErrorOr<NameString> parse_name_string(BAN::ConstByteSpan& aml_data); BAN::ErrorOr<NameString> parse_name_string(BAN::ConstByteSpan& aml_data);
BAN::ErrorOr<BAN::ConstByteSpan> parse_pkg(BAN::ConstByteSpan& aml_data); BAN::ErrorOr<BAN::ConstByteSpan> parse_pkg(BAN::ConstByteSpan& aml_data);
BAN::ErrorOr<Node> convert_node(Node&& source, uint8_t conversion, uint64_t max_length); BAN::ErrorOr<Node> convert_node(Node&& source, uint8_t conversion, size_t max_length);
BAN::ErrorOr<Node> convert_node(Node&& source, const Node& target); BAN::ErrorOr<Node> convert_node(Node&& source, const Node& target);
BAN::ErrorOr<Node> evaluate_node(const Scope& node_path, const Node& node); BAN::ErrorOr<Node> evaluate_node(const Scope& node_path, const Node& node);

View File

@ -10,7 +10,7 @@ namespace Kernel::ACPI::AML
BAN::ErrorOr<void> parse_index_field_op(ParseContext& context); BAN::ErrorOr<void> parse_index_field_op(ParseContext& context);
BAN::ErrorOr<void> parse_bank_field_op(ParseContext& context); BAN::ErrorOr<void> parse_bank_field_op(ParseContext& context);
BAN::ErrorOr<Node> convert_from_field_unit(const Node& node, uint8_t conversion, uint64_t max_length); BAN::ErrorOr<Node> convert_from_field_unit(const Node& node, uint8_t conversion, size_t max_length);
BAN::ErrorOr<void> store_to_field_unit(const Node& source, const Node& target); BAN::ErrorOr<void> store_to_field_unit(const Node& source, const Node& target);
} }

View File

@ -551,7 +551,7 @@ namespace Kernel::ACPI::AML
} }
} }
BAN::ErrorOr<Node> convert_node(Node&& source, uint8_t conversion, uint64_t max_length) BAN::ErrorOr<Node> convert_node(Node&& source, uint8_t conversion, size_t max_length)
{ {
dprintln_if(AML_DUMP_FUNCTION_CALLS, "convert_node {} -> 0b{3b}", source, conversion); dprintln_if(AML_DUMP_FUNCTION_CALLS, "convert_node {} -> 0b{3b}", source, conversion);

View File

@ -652,7 +652,7 @@ namespace Kernel::ACPI::AML
return {}; return {};
} }
BAN::ErrorOr<Node> convert_from_field_unit(const Node& source, uint8_t conversion, uint64_t max_length) BAN::ErrorOr<Node> convert_from_field_unit(const Node& source, uint8_t conversion, size_t max_length)
{ {
ASSERT(source.type == Node::Type::FieldUnit); ASSERT(source.type == Node::Type::FieldUnit);

View File

@ -2,13 +2,12 @@
namespace CPUID namespace CPUID
{ {
void get_cpuid(uint32_t code, uint32_t* out)
static inline void get_cpuid(uint32_t code, uint32_t* out)
{ {
asm volatile("cpuid" : "=a"(out[0]), "=b"(out[1]), "=c"(out[2]), "=d"(out[3]) : "a"(code)); asm volatile("cpuid" : "=a"(out[0]), "=b"(out[1]), "=c"(out[2]), "=d"(out[3]) : "a"(code));
} }
static inline void get_cpuid_string(uint32_t code, uint32_t* out) void get_cpuid_string(uint32_t code, uint32_t* out)
{ {
asm volatile ("cpuid": "=a"(out[0]), "=b"(out[0]), "=d"(out[1]), "=c"(out[2]) : "a"(code)); asm volatile ("cpuid": "=a"(out[0]), "=b"(out[0]), "=d"(out[1]), "=c"(out[2]) : "a"(code));
} }

View File

@ -473,7 +473,6 @@ namespace Kernel
dirp->d_ino = entry.ino; dirp->d_ino = entry.ino;
dirp->d_type = entry.type; dirp->d_type = entry.type;
strncpy(dirp->d_name, entry.name, entry.name_len); strncpy(dirp->d_name, entry.name, entry.name_len);
dirp->d_name[entry.name_len] = '\0';
dirp++; dirp++;
} }

View File

@ -1,8 +1,7 @@
#include <errno.h> #include <errno.h>
#include <string.h> #include <string.h>
#include <sys/weak_alias.h>
extern "C" int _memcmp(const void* s1, const void* s2, size_t n) int memcmp(const void* s1, const void* s2, size_t n)
{ {
auto* u1 = static_cast<const unsigned char*>(s1); auto* u1 = static_cast<const unsigned char*>(s1);
auto* u2 = static_cast<const unsigned char*>(s2); auto* u2 = static_cast<const unsigned char*>(s2);
@ -11,9 +10,8 @@ extern "C" int _memcmp(const void* s1, const void* s2, size_t n)
return u1[i] - u2[i]; return u1[i] - u2[i];
return 0; return 0;
} }
weak_alias(_memcmp, memcmp);
extern "C" void* _memcpy(void* __restrict s1, const void* __restrict s2, size_t n) void* memcpy(void* __restrict s1, const void* __restrict s2, size_t n)
{ {
auto* dst = static_cast<unsigned char*>(s1); auto* dst = static_cast<unsigned char*>(s1);
auto* src = static_cast<const unsigned char*>(s2); auto* src = static_cast<const unsigned char*>(s2);
@ -21,9 +19,8 @@ extern "C" void* _memcpy(void* __restrict s1, const void* __restrict s2, size_t
dst[i] = src[i]; dst[i] = src[i];
return s1; return s1;
} }
weak_alias(_memcpy, memcpy);
extern "C" void* _memmove(void* s1, const void* s2, size_t n) void* memmove(void* s1, const void* s2, size_t n)
{ {
auto* dst = static_cast<unsigned char*>(s1); auto* dst = static_cast<unsigned char*>(s1);
auto* src = static_cast<const unsigned char*>(s2); auto* src = static_cast<const unsigned char*>(s2);
@ -39,57 +36,40 @@ extern "C" void* _memmove(void* s1, const void* s2, size_t n)
} }
return s1; return s1;
} }
weak_alias(_memmove, memmove);
extern "C" void* _memset(void* s, int c, size_t n) void* memset(void* s, int c, size_t n)
{ {
auto* u = static_cast<unsigned char*>(s); auto* u = static_cast<unsigned char*>(s);
for (size_t i = 0; i < n; i++) for (size_t i = 0; i < n; i++)
u[i] = c; u[i] = c;
return s; return s;
} }
weak_alias(_memset, memset);
extern "C" size_t _strlen(const char* str) size_t strlen(const char* str)
{ {
size_t len = 0; size_t len = 0;
while (str[len]) while (str[len])
len++; len++;
return len; return len;
} }
weak_alias(_strlen, strlen);
extern "C" char* _stpcpy(char* __restrict dst, const char* __restrict src) char* strcpy(char* __restrict dst, const char* __restrict src)
{ {
size_t i = 0; size_t i = 0;
for (; src[i]; i++) for (; src[i]; i++)
dst[i] = src[i]; dst[i] = src[i];
dst[i] = '\0'; dst[i] = '\0';
return &dst[i]; return dst;
} }
weak_alias(_stpcpy, stpcpy);
extern "C" char* _stpncpy(char* __restrict dst, const char* __restrict src, size_t n) char* strncpy(char* __restrict dst, const char* __restrict src, size_t len)
{ {
size_t i = 0; size_t i = 0;
for (; src[i] && n; i++, n--) for (; i < len && src[i]; i++)
dst[i] = src[i]; dst[i] = src[i];
for (; n; i++, n--) if (i < len)
dst[i] = '\0'; dst[i] = '\0';
return &dst[i]; return dst;
}
weak_alias(_stpncpy, stpncpy);
char* strcpy(char* __restrict__ dest, const char* __restrict__ src)
{
stpcpy(dest, src);
return dest;
}
char* strncpy(char* __restrict__ dest, const char* __restrict__ src, size_t n)
{
stpncpy(dest, src, n);
return dest;
} }
const char* strerrordesc_np(int error) const char* strerrordesc_np(int error)

View File

@ -45,7 +45,6 @@ set(LIBC_SOURCES
icxxabi.cpp icxxabi.cpp
arch/${BANAN_ARCH}/setjmp.S arch/${BANAN_ARCH}/setjmp.S
arch/${BANAN_ARCH}/string.S
../../../BAN/BAN/Assert.cpp ../../../BAN/BAN/Assert.cpp
) )
@ -53,7 +52,7 @@ set(LIBC_SOURCES
add_library(objlibc OBJECT ${LIBC_SOURCES}) add_library(objlibc OBJECT ${LIBC_SOURCES})
target_compile_definitions(objlibc PRIVATE __arch=${BANAN_ARCH}) target_compile_definitions(objlibc PRIVATE __arch=${BANAN_ARCH})
target_compile_options(objlibc PRIVATE -O2 -g -Wstack-usage=512 -fno-exceptions -fpic -nolibc) target_compile_options(objlibc PRIVATE -O2 -g -Wstack-usage=512 -fno-tree-loop-distribute-patterns -fno-exceptions -fpic -nolibc)
target_compile_options(objlibc PUBLIC -Wall -Wextra -Werror -Wno-error=stack-usage=) target_compile_options(objlibc PUBLIC -Wall -Wextra -Werror -Wno-error=stack-usage=)
function(add_crtx crtx) function(add_crtx crtx)

View File

@ -1,85 +0,0 @@
.global memchr
memchr:
xchgl 4(%esp), %edi
movl 8(%esp), %eax
movl 12(%esp), %ecx
repne scasb
xorl %eax, %eax
testl %ecx, %ecx
cmovnzl %edi, %eax
movl 4(%esp), %edi
ret
.global memcmp
memcmp:
xchgl 4(%esp), %edi
xchgl 8(%esp), %esi
movl 12(%esp), %ecx
repe cmpsb
jne .memcmp_not_equal
xorl %eax, %eax
jmp .memcmp_done
.memcmp_not_equal:
movzbl -1(%edi), %eax
movzbl -1(%esi), %ecx
subl %ecx, %eax
.memcmp_done:
movl 4(%esp), %edi
movl 8(%esp), %esi
ret
.global memcpy
memcpy:
xchgl 4(%esp), %edi
xchgl 8(%esp), %esi
movl 12(%esp), %ecx
movl %edi, %edx
rep movsb
movl 4(%esp), %edi
movl 8(%esp), %esi
movl %edx, %eax
ret
.global memmove
memmove:
xchgl 4(%esp), %edi
xchgl 8(%esp), %esi
movl 12(%esp), %ecx
movl %edi, %edx
cmpl %edi, %esi
jb .memmove_slow
rep movsb
.memmove_done:
movl 4(%esp), %edi
movl 8(%esp), %esi
movl %edx, %eax
ret
.memmove_slow:
leal -1(%edi, %ecx), %edi
leal -1(%esi, %ecx), %esi
std
rep movsb
cld
jmp .memmove_done
.global memset
memset:
xchgl 4(%esp), %edi
movl 8(%esp), %eax
movl 12(%esp), %ecx
movl %edi, %edx
rep stosb
movl 4(%esp), %edi
movl %edx, %eax
ret
.global strlen
strlen:
xchgl 4(%esp), %edi
xorb %al, %al
movl $-1, %ecx
repne scasb
movl 4(%esp), %edi
movl $-2, %eax
subl %ecx, %eax
ret

View File

@ -1,62 +0,0 @@
.global memchr
memchr:
movb %sil, %al
movq %rdx, %rcx
repne scasb
xorq %rax, %rax
testq %rcx, %rcx
cmovnzq %rdi, %rax
ret
.global memcmp
memcmp:
movq %rdx, %rcx
repe cmpsb
jne .memcmp_not_equal
xorq %rax, %rax
ret
.memcmp_not_equal:
movzbl -1(%rdi), %eax
movzbl -1(%rsi), %ecx
subq %rcx, %rax
ret
.global memcpy
memcpy:
movq %rdi, %rax
movq %rdx, %rcx
movq %rdi, %rdx
rep movsb
movq %rdx, %rax
ret
.global memmove
memmove:
cmpq %rdi, %rsi
jae memcpy
leaq -1(%rdi, %rdx), %rdi
leaq -1(%rsi, %rdx), %rsi
movq %rdx, %rcx
std
rep movsb
cld
leaq 1(%rdi), %rax
ret
.global memset
memset:
movq %rdi, %r8
movb %sil, %al
movq %rdx, %rcx
rep stosb
movq %r8, %rax
ret
.global strlen
strlen:
xorb %al, %al
movq $-1, %rcx
repne scasb
movq $-2, %rax
subq %rcx, %rax
ret

View File

@ -32,9 +32,9 @@ __BEGIN_DECLS
#define F_WRLCK 3 #define F_WRLCK 3
// NOTE: also defined in stdio.h // NOTE: also defined in stdio.h
#define SEEK_SET 0 #define SEEK_SET 1
#define SEEK_CUR 1 #define SEEK_CUR 2
#define SEEK_END 2 #define SEEK_END 3
/* bits 0-3 */ /* bits 0-3 */
#define O_RDONLY 0x00001 #define O_RDONLY 0x00001

View File

@ -0,0 +1,117 @@
#ifndef _STDINT_H
#define _STDINT_H 1
// https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdint.h.html
#include <sys/cdefs.h>
__BEGIN_DECLS
typedef __INT8_TYPE__ int8_t;
typedef __INT16_TYPE__ int16_t;
typedef __INT32_TYPE__ int32_t;
typedef __INT64_TYPE__ int64_t;
typedef __UINT8_TYPE__ uint8_t;
typedef __UINT16_TYPE__ uint16_t;
typedef __UINT32_TYPE__ uint32_t;
typedef __UINT64_TYPE__ uint64_t;
typedef __INT_LEAST8_TYPE__ int_least8_t;
typedef __INT_LEAST16_TYPE__ int_least16_t;
typedef __INT_LEAST32_TYPE__ int_least32_t;
typedef __INT_LEAST64_TYPE__ int_least64_t;
typedef __UINT_LEAST8_TYPE__ uint_least8_t;
typedef __UINT_LEAST16_TYPE__ uint_least16_t;
typedef __UINT_LEAST32_TYPE__ uint_least32_t;
typedef __UINT_LEAST64_TYPE__ uint_least64_t;
typedef __INT_FAST8_TYPE__ int_fast8_t;
typedef __INT_FAST16_TYPE__ int_fast16_t;
typedef __INT_FAST32_TYPE__ int_fast32_t;
typedef __INT_FAST64_TYPE__ int_fast64_t;
typedef __UINT_FAST8_TYPE__ uint_fast8_t;
typedef __UINT_FAST16_TYPE__ uint_fast16_t;
typedef __UINT_FAST32_TYPE__ uint_fast32_t;
typedef __UINT_FAST64_TYPE__ uint_fast64_t;
typedef __INTPTR_TYPE__ intptr_t;
typedef __UINTPTR_TYPE__ uintptr_t;
// FIXME: is this the correct?
typedef int64_t intmax_t;
typedef uint64_t uintmax_t;
#define INT8_MIN (-INT8_MAX - 1)
#define INT16_MIN (-INT16_MAX - 1)
#define INT32_MIN (-INT32_MAX - 1)
#define INT64_MIN (-INT64_MAX - 1)
#define INT8_MAX __INT8_MAX__
#define INT16_MAX __INT16_MAX__
#define INT32_MAX __INT32_MAX__
#define INT64_MAX __INT64_MAX__
#define UINT8_MAX __UINT8_MAX__
#define UINT16_MAX __UINT16_MAX__
#define UINT32_MAX __UINT32_MAX__
#define UINT64_MAX __UINT64_MAX__
#define INT_LEAST8_MIN (-INT_LEAST8_MAX - 1)
#define INT_LEAST16_MIN (-INT_LEAST16_MAX - 1)
#define INT_LEAST32_MIN (-INT_LEAST32_MAX - 1)
#define INT_LEAST64_MIN (-INT_LEAST64_MAX - 1)
#define INT_LEAST8_MAX __INT_LEAST8_MAX__
#define INT_LEAST16_MAX __INT_LEAST16_MAX__
#define INT_LEAST32_MAX __INT_LEAST32_MAX__
#define INT_LEAST64_MAX __INT_LEAST64_MAX__
#define UINT_LEAST8_MAX __UINT_LEAST8_MAX__
#define UINT_LEAST16_MAX __UINT_LEAST16_MAX__
#define UINT_LEAST32_MAX __UINT_LEAST32_MAX__
#define UINT_LEAST64_MAX __UINT_LEAST64_MAX__
#define INT_FAST8_MIN (-INT_FAST8_MAX - 1)
#define INT_FAST16_MIN (-INT_FAST16_MAX - 1)
#define INT_FAST32_MIN (-INT_FAST32_MAX - 1)
#define INT_FAST64_MIN (-INT_FAST64_MAX - 1)
#define INT_FAST8_MAX __INT_FAST8_MAX__
#define INT_FAST16_MAX __INT_FAST16_MAX__
#define INT_FAST32_MAX __INT_FAST32_MAX__
#define INT_FAST64_MAX __INT_FAST64_MAX__
#define UINT_FAST8_MAX __UINT_FAST8_MAX__
#define UINT_FAST16_MAX __UINT_FAST16_MAX__
#define UINT_FAST32_MAX __UINT_FAST32_MAX__
#define UINT_FAST64_MAX __UINT_FAST64_MAX__
#define INTPTR_MIN (-INTPTR_MAX - 1)
#define INTPTR_MAX __INTPTR_MAX__
#define UINTPTR_MAX __UINTPTR_MAX__
// FIXME: is this the correct?
#define INTMAX_MIN INT64_MIN
#define INTMAX_MAX INT64_MAX
#define UINTMAX_MAX UINT64_MAX
#define PTRDIFF_MIN -65535
#define PTRDIFF_MAX +65535
#define SIG_ATOMIC_MIN __SIG_ATOMIC_MIN__
#define SIG_ATOMIC_MAX __SIG_ATOMIC_MAX__
#define SIZE_MAX __SIZE_MAX__
#define WCHAR_MIN __WCHAR_MIN__
#define WCHAR_MAX __WCHAR_MAX__
#define WINT_MIN __WINT_MIN__
#define WINT_MAX __WINT_MAX__
__END_DECLS
#endif

View File

@ -35,9 +35,9 @@ typedef off_t fpos_t;
#define _IONBF 3 #define _IONBF 3
// NOTE: also defined in fcntl.h // NOTE: also defined in fcntl.h
#define SEEK_SET 0 #define SEEK_SET 1
#define SEEK_CUR 1 #define SEEK_CUR 2
#define SEEK_END 2 #define SEEK_END 3
#define FILENAME_MAX 256 #define FILENAME_MAX 256
#define FOPEN_MAX 16 #define FOPEN_MAX 16

View File

@ -1,7 +0,0 @@
#ifndef _SYS_WEAK_ALIAS
#define _SYS_WEAK_ALIAS 1
#define weak_alias(name, aliasname) _weak_alias (name, aliasname)
#define _weak_alias(name, aliasname) extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)))
#endif

View File

@ -7,13 +7,8 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <sys/weak_alias.h>
#if defined(__GNUC__) && !defined(__clang__) void* memccpy(void* __restrict s1, const void* __restrict s2, int c, size_t n)
#pragma GCC optimize "no-tree-loop-distribute-patterns"
#endif
extern "C" void* _memccpy(void* __restrict s1, const void* __restrict s2, int c, size_t n)
{ {
unsigned char* dst = static_cast<unsigned char*>(s1); unsigned char* dst = static_cast<unsigned char*>(s1);
const unsigned char* src = static_cast<const unsigned char*>(s2); const unsigned char* src = static_cast<const unsigned char*>(s2);
@ -22,9 +17,8 @@ extern "C" void* _memccpy(void* __restrict s1, const void* __restrict s2, int c,
return dst + i + 1; return dst + i + 1;
return nullptr; return nullptr;
} }
weak_alias(_memccpy, memccpy);
extern "C" void* _memchr(const void* s, int c, size_t n) void* memchr(const void* s, int c, size_t n)
{ {
const unsigned char* u = static_cast<const unsigned char*>(s); const unsigned char* u = static_cast<const unsigned char*>(s);
for (size_t i = 0; i < n; i++) for (size_t i = 0; i < n; i++)
@ -32,20 +26,20 @@ extern "C" void* _memchr(const void* s, int c, size_t n)
return const_cast<unsigned char*>(u + i); return const_cast<unsigned char*>(u + i);
return nullptr; return nullptr;
} }
weak_alias(_memchr, memchr);
extern "C" int _memcmp(const void* s1, const void* s2, size_t n) int memcmp(const void* s1, const void* s2, size_t n)
{ {
const unsigned char* a = static_cast<const unsigned char*>(s1); const unsigned char* a = static_cast<const unsigned char*>(s1);
const unsigned char* b = static_cast<const unsigned char*>(s2); const unsigned char* b = static_cast<const unsigned char*>(s2);
for (size_t i = 0; i < n; i++) for (size_t i = 0; i < n; i++)
if (a[i] != b[i]) if (a[i] != b[i])
return a[i] - b[i]; return a[i] - b[i];
return 0; return 0;
} }
weak_alias(_memcmp, memcmp);
extern "C" void* _memcpy(void* __restrict__ dstp, const void* __restrict__ srcp, size_t n) void* memcpy(void* __restrict__ dstp, const void* __restrict__ srcp, size_t n)
{ {
unsigned char* dst = static_cast<unsigned char*>(dstp); unsigned char* dst = static_cast<unsigned char*>(dstp);
const unsigned char* src = static_cast<const unsigned char*>(srcp); const unsigned char* src = static_cast<const unsigned char*>(srcp);
@ -53,12 +47,12 @@ extern "C" void* _memcpy(void* __restrict__ dstp, const void* __restrict__ srcp,
dst[i] = src[i]; dst[i] = src[i];
return dstp; return dstp;
} }
weak_alias(_memcpy, memcpy);
extern "C" void* _memmove(void* destp, const void* srcp, size_t n) void* memmove(void* destp, const void* srcp, size_t n)
{ {
unsigned char* dest = static_cast<unsigned char*>(destp); unsigned char* dest = static_cast<unsigned char*>(destp);
const unsigned char* src = static_cast<const unsigned char*>(srcp); const unsigned char* src = static_cast<const unsigned char*>(srcp);
if (dest < src) if (dest < src)
{ {
for (size_t i = 0; i < n; i++) for (size_t i = 0; i < n; i++)
@ -69,20 +63,19 @@ extern "C" void* _memmove(void* destp, const void* srcp, size_t n)
for (size_t i = 1; i <= n; i++) for (size_t i = 1; i <= n; i++)
dest[n - i] = src[n - i]; dest[n - i] = src[n - i];
} }
return destp; return destp;
} }
weak_alias(_memmove, memmove);
extern "C" void* _memset(void* s, int c, size_t n) void* memset(void* s, int c, size_t n)
{ {
unsigned char* p = static_cast<unsigned char*>(s); unsigned char* p = static_cast<unsigned char*>(s);
for (size_t i = 0; i < n; i++) for (size_t i = 0; i < n; i++)
p[i] = c; p[i] = c;
return s; return s;
} }
weak_alias(_memset, memset);
extern "C" int _strcmp(const char* s1, const char* s2) int strcmp(const char* s1, const char* s2)
{ {
const unsigned char* u1 = (unsigned char*)s1; const unsigned char* u1 = (unsigned char*)s1;
const unsigned char* u2 = (unsigned char*)s2; const unsigned char* u2 = (unsigned char*)s2;
@ -91,9 +84,8 @@ extern "C" int _strcmp(const char* s1, const char* s2)
break; break;
return *u1 - *u2; return *u1 - *u2;
} }
weak_alias(_strcmp, strcmp);
extern "C" int _strncmp(const char* s1, const char* s2, size_t n) int strncmp(const char* s1, const char* s2, size_t n)
{ {
if (n == 0) if (n == 0)
return 0; return 0;
@ -104,9 +96,8 @@ extern "C" int _strncmp(const char* s1, const char* s2, size_t n)
break; break;
return *u1 - *u2; return *u1 - *u2;
} }
weak_alias(_strncmp, strncmp);
extern "C" char* _stpcpy(char* __restrict__ dest, const char* __restrict__ src) char* stpcpy(char* __restrict__ dest, const char* __restrict__ src)
{ {
size_t i = 0; size_t i = 0;
for (; src[i]; i++) for (; src[i]; i++)
@ -114,9 +105,8 @@ extern "C" char* _stpcpy(char* __restrict__ dest, const char* __restrict__ src)
dest[i] = '\0'; dest[i] = '\0';
return &dest[i]; return &dest[i];
} }
weak_alias(_stpcpy, stpcpy);
extern "C" char* _stpncpy(char* __restrict__ dest, const char* __restrict__ src, size_t n) char* stpncpy(char* __restrict__ dest, const char* __restrict__ src, size_t n)
{ {
size_t i = 0; size_t i = 0;
for (; src[i] && n; i++, n--) for (; src[i] && n; i++, n--)
@ -125,7 +115,6 @@ extern "C" char* _stpncpy(char* __restrict__ dest, const char* __restrict__ src,
dest[i] = '\0'; dest[i] = '\0';
return &dest[i]; return &dest[i];
} }
weak_alias(_stpncpy, stpncpy);
char* strcpy(char* __restrict__ dest, const char* __restrict__ src) char* strcpy(char* __restrict__ dest, const char* __restrict__ src)
{ {
@ -213,30 +202,31 @@ char* strndup(const char* str, size_t size)
return new_str; return new_str;
} }
extern "C" size_t _strlen(const char* str) size_t strlen(const char* str)
{ {
size_t len = 0; size_t len = 0;
while (str[len]) while (str[len])
len++; len++;
return len; return len;
} }
weak_alias(_strlen, strlen);
extern "C" size_t _strnlen(const char* str, size_t maxlen) size_t strnlen(const char* str, size_t maxlen)
{ {
size_t len = 0; size_t len = 0;
while (len < maxlen && str[len]) while (len < maxlen && str[len])
len++; len++;
return len; return len;
} }
weak_alias(_strnlen, strnlen);
char* strchr(const char* str, int c) char* strchr(const char* str, int c)
{ {
if (c == '\0') while (*str)
return const_cast<char*>(str + strlen(str)); {
char* result = strchrnul(str, c); if (*str == (char)c)
return *result ? result : nullptr; return (char*)str;
str++;
}
return (*str == (char)c) ? (char*)str : nullptr;
} }
char* strchrnul(const char* str, int c) char* strchrnul(const char* str, int c)
@ -247,7 +237,7 @@ char* strchrnul(const char* str, int c)
return (char*)str; return (char*)str;
str++; str++;
} }
return const_cast<char*>(str); return (char*)str;
} }
char* strrchr(const char* str, int c) char* strrchr(const char* str, int c)