summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2024-01-27 03:01:34 -0500
committerFreya Murphy <freya@freyacat.org>2024-01-27 03:02:02 -0500
commitedc40ed8b1165c857bfe954b4ab2fa564c5c24e3 (patch)
treee3f3dc40f0d14d5e064223c4394a1a6d783354c4 /src
parentserial and fix makefile (diff)
downloadcorn-edc40ed8b1165c857bfe954b4ab2fa564c5c24e3.tar.gz
corn-edc40ed8b1165c857bfe954b4ab2fa564c5c24e3.tar.bz2
corn-edc40ed8b1165c857bfe954b4ab2fa564c5c24e3.zip
update libs
Diffstat (limited to 'src')
-rw-r--r--src/lib.c219
1 files changed, 214 insertions, 5 deletions
diff --git a/src/lib.c b/src/lib.c
index d072f1a..a2fa3e5 100644
--- a/src/lib.c
+++ b/src/lib.c
@@ -1,14 +1,223 @@
#include <lib.h>
-int strncmp(const char *lhs, const char *rhs, unsigned long n) {
+#include <stddef.h>
+
+int memcmp(const void *restrict vl, const void *restrict vr, unsigned long n) {
+ const unsigned char *l = vl, *r = vr;
+ for (; n && *l == *r; n--, l++, r++);
+ return n ? *l-*r : 0;
+}
+
+void *memcpy(void *restrict dest, const void *restrict src, unsigned long n) {
+ char *d = dest;
+ const char *s = src;
+ for (; n; n--) *d++ = *s++;
+ return dest;
+}
+
+void *memmove(void *dest, const void *src, unsigned long n) {
+ char *d = dest;
+ const char *s = src;
+
+ if (d==s) return d;
+
+ if (d<s) {
+ for (; n; n--) *d++ = *s++;
+ } else {
+ while (n) n--, d[n] = s[n];
+ }
+
+ return dest;
+}
+
+void *memset(void *restrict dest, int c, unsigned long n) {
+ unsigned char *d = dest;
+ for (; n; n--) *d++ = c;
+ return dest;
+}
+
+int strncmp(const char *restrict lhs, const char *restrict rhs, unsigned long n) {
const unsigned char *l=(void *)lhs, *r=(void *)rhs;
if (!n--) return 0;
for (; *l && *r && n && *l == *r ; l++, r++, n--);
return *l - *r;
}
-int memcmp(const void *vl, const void *vr, unsigned long n) {
- const unsigned char *l = vl, *r = vr;
- for (; n && *l == *r; n--, l++, r++);
- return n ? *l-*r : 0;
+int isspace(int c) {
+ switch (c) {
+ case ' ':
+ case '\t':
+ case '\v':
+ case '\f':
+ case '\r':
+ case '\n':
+ return 1;
+ default:
+ return 0;
+ }
}
+
+int isdigit(int c) {
+ return c - '0' > -1 && c - '0' < 10;
+}
+
+
+#define ATOX(name, type) \
+ type name(const char* s) { \
+ for(; isspace(*s); s++); \
+ int neg = 0; \
+ switch (*s) { \
+ case '-': \
+ neg = 1; \
+ /* FALLTHRU */ \
+ case '+': \
+ s++; \
+ break; \
+ } \
+ type num = 0; \
+ for (; *s == '0'; s++); \
+ for (; isdigit(*s); s++) { \
+ num *= 10; \
+ num += *s - '0'; \
+ } \
+ return num * (neg ? -1 : 1); \
+ }
+
+ATOX(atoi, int)
+ATOX(atol, long int)
+ATOX(atoll, long long int)
+
+char itoc(int i) {
+ if(i < 10) {
+ return '0' + i;
+ } else {
+ return 'a' + (i - 10);
+ }
+}
+
+int ctoi(char c) {
+ if(c < 'A') {
+ return c - '0';
+ } else if(c < 'a') {
+ return c - 'A' + 10;
+ } else {
+ return c - 'a' + 10;
+ }
+}
+
+#define UXTOA(type, name) \
+ char *name(unsigned type n, char *buffer, int radix) { \
+ if (n == 0) { \
+ buffer[0] = '0'; \
+ buffer[1] = '\0'; \
+ return buffer; \
+ } \
+ char *start = buffer; \
+ for (; n; n /= radix) { \
+ *buffer++ = itoc(n % radix); \
+ } \
+ *buffer-- = '\0'; \
+ while(buffer > start) { \
+ char tmp = *start; \
+ *start++ = *buffer; \
+ *buffer-- = tmp; \
+ } \
+ return buffer; \
+ }
+
+UXTOA(int, utoa)
+UXTOA(long int, ultoa)
+
+#define XTOA(type, name) \
+ char *name(type n, char* buffer, int radix) { \
+ if (n == 0) { \
+ buffer[0] = '0'; \
+ buffer[1] = '\0'; \
+ return buffer; \
+ } \
+ if (n < 0) { \
+ *buffer++ = '-'; \
+ n = -n; \
+ } \
+ char *start = buffer; \
+ for (; n; n /= radix) { \
+ *buffer++ = itoc(n % radix); \
+ } \
+ *buffer-- = '\0'; \
+ while(buffer > start) { \
+ char tmp = *start; \
+ *start++ = *buffer; \
+ *buffer-- = tmp; \
+ } \
+ return buffer; \
+ }
+
+XTOA(int, itoa)
+XTOA(long int, ltoa)
+
+char *ftoa(float f, char *buffer) {
+ char *b = buffer;
+ if (f < 0 || f == -0)
+ *buffer++ = '-';
+ int n, i=0, k=0;
+ n = (int) f;
+ while (n > 0) {
+ f /= 10;
+ n = (int)f;
+ i++;
+ }
+ *(buffer+i) = '.';
+ f *= 10;
+ n = (int) f;
+ f -= n;
+ while ((n > 0.1) || (i > k)) {
+ if (k == i)
+ k++;
+ *(buffer+k) = '0' + n;
+ f *= 10;
+ n = (int) f;
+ f -= n;
+ k++;
+ }
+ *(buffer+k) = '\0';
+ return b;
+}
+
+#define STRTOX(name, type) \
+ type name(const char *s, char **endptr, int radix) { \
+ *endptr = NULL; \
+ for(; isspace(*s); s++); \
+ int neg = 0; \
+ switch (*s) { \
+ case '-': \
+ neg = 1; \
+ /* FALLTHRU */ \
+ case '+': \
+ s++; \
+ break; \
+ } \
+ if (!radix) { \
+ if (*s == '0') { \
+ s++; \
+ if (*s == 'x' || *s == 'X') { \
+ s++; \
+ radix = 16; \
+ } else { \
+ radix = 8; \
+ } \
+ } else { \
+ radix = 10; \
+ } \
+ } \
+ for (; *s == '0'; s++, *endptr = (void*) s); \
+ type num = 0; \
+ for (; isdigit(*s); s++, *endptr = (void*) s) { \
+ num *= radix; \
+ num += *s - '0'; \
+ } \
+ return num * (neg ? -1 : 1); \
+ }
+
+STRTOX(strtoi, int)
+STRTOX(strtol, long int)
+STRTOX(strtoll, long long int)