bottleros/Userland/SampleCodeModule/libc.c

338 lines
6.2 KiB
C

#include "libc.h"
void printString(char *string) {
int len = strlen(string);
sys_write(1, string, len);
}
void printStringLen(char *string, int len) {
sys_write(1, string, len);
}
void printStringError(char *string) {
int len = strlen(string);
sys_write(2, string, len);
}
int strlen(const char *s) {
int i = 0;
for (i = 0; s[i] != '\0'; i++);
return i;
}
int strcmp(const char *s1, const char *s2) {
while (*s1 && (*s1 == *s2)) {
s1++;
s2++;
}
return *s1 - *s2;
}
char *strcat(char *dest, const char *src) {
char *rdest = dest;
while (*dest)
dest++;
while ((*dest++ = *src++));
return rdest;
}
void putChar(char c) {
char buffer = c;
sys_write(1, &buffer, 0);
}
void newline() {
putChar('\n');
}
void backspace() {
putChar('\b');
}
void addEOF() {
putChar(-1);
}
void winClear() {
sys_write(1, "\e\f", 2);
}
int strcpy(char *strDest, const char *strSrc) {
int i = 0;
while ((*strDest++ = *strSrc++)) {
i++;
}
return i;
}
char *gtoa(int value, char *buffer, int base, int length) {
if (base < 2 || base > 32) {
return buffer;
}
int n = abs(value);
int i = 0;
while (n && i < length) {
int r = n % base;
if (r >= 10) {
buffer[i++] = 65 + (r - 10);
} else {
buffer[i++] = 48 + r;
}
n = n / base;
}
if (i == 0) {
buffer[i++] = '0';
}
if (value < 0 && base == 10) {
buffer[i++] = '-';
}
buffer[i] = '\0';
return reverse(buffer, 0, i - 1);
}
char getChar() {
char buffer[1] = {0};
if (sys_read(0, buffer, 1) <= 0)
return -1;
return buffer[0];
}
void swap(char *x, char *y) {
char t = *x;
*x = *y;
*y = t;
}
char *reverse(char *buffer, int i, int j) {
while (i < j) {
swap(&buffer[i++], &buffer[j--]);
}
return buffer;
}
int abs(int value) {
return value < 0 ? -value : value;
}
char *itoa(int value, char *buffer, int base) {
if (base < 2 || base > 32) {
return buffer;
}
int n = abs(value);
int i = 0;
while (n) {
int r = n % base;
if (r >= 10) {
buffer[i++] = 65 + (r - 10);
} else {
buffer[i++] = 48 + r;
}
n = n / base;
}
if (i == 0) {
buffer[i++] = '0';
}
if (value < 0 && base == 10) {
buffer[i++] = '-';
}
buffer[i] = '\0';
return reverse(buffer, 0, i - 1);
}
int atoi(char *str) {
int i = 0, sign = 1, val = 0;
while (str[i] != '\0') {
if (str[i] == '-') {
sign = -sign;
str++;
}
i++;
}
i = 0;
while (str[i] >= '0' && str[i] <= '9' && str[i] != '\0') {
int nbr = (int) (str[i] - '0');
val = (val * 10) + nbr;
i++;
}
i++;
return (val * sign);
}
int pow(int base, int exponent) {
int result = 1;
for (; exponent > 0; exponent--) {
result = result * base;
}
return result;
}
char isFloat(char *str) {
int dot = 0;
if (*str == '-')
str++;
while (*str != 0) {
if (*str == '.' && !dot)
dot = 1;
else if (!isNumber(*str) || (*str == '.' && dot)) {
return 0;
}
str++;
}
return 1;
}
float atof(char *arr) {
float val = 0;
int afterdot = 0;
float scale = 1;
int neg = 0;
if (*arr == '-') {
arr++;
neg = 1;
}
while (*arr) {
if (afterdot) {
scale = scale / 10;
val = val + (*arr - '0') * scale;
} else {
if (*arr == '.')
afterdot++;
else
val = val * 10.0 + (*arr - '0');
}
arr++;
}
if (neg) return -val;
else return val;
}
char *strstrip(char *s, char c) {
while (*s != 0) {
if (*s != c)
break;
s++;
}
return s;
}
char *strtok(char *s, char delim) {
char *ptr = s;
if (s == 0) {
return 0;
}
int flag = 0;
while (*ptr != 0) {
if (*ptr == delim) {
flag = 1;
*ptr = 0;
} else if (flag == 1)
return ptr;
ptr++;
}
return ptr;
}
char isNumber(char c) {
return c <= '9' && c >= '0';
}
// Tomada y modificada de https://github.com/antongus/stm32tpl/blob/master/ftoa.c
#define MAX_PRECISION (10)
static const double rounders[MAX_PRECISION + 1] =
{
0.5, // 0
0.05, // 1
0.005, // 2
0.0005, // 3
0.00005, // 4
0.000005, // 5
0.0000005, // 6
0.00000005, // 7
0.000000005, // 8
0.0000000005, // 9
0.00000000005 // 10
};
void ftoa(double f, char *buf, int precision) {
char *ptr = buf;
char *p = ptr;
char *p1;
char c;
long intPart;
if (precision > MAX_PRECISION)
precision = MAX_PRECISION;
if (f < 0) {
f = -f;
*ptr++ = '-';
}
if (precision < 0) {
if (f < 1.0) precision = 6;
else if (f < 10.0) precision = 5;
else if (f < 100.0) precision = 4;
else if (f < 1000.0) precision = 3;
else if (f < 10000.0) precision = 2;
else if (f < 100000.0) precision = 1;
else precision = 0;
}
if (precision)
f += rounders[precision];
intPart = f;
f -= intPart;
if (!intPart)
*ptr++ = '0';
else {
p = ptr;
while (intPart) {
*p++ = '0' + intPart % 10;
intPart /= 10;
}
p1 = p;
while (p > ptr) {
c = *--p;
*p = *ptr;
*ptr++ = c;
}
ptr = p1;
}
if (precision && ((int) (f * pow(10, precision))) != 0) {
*ptr++ = '.';
while (precision-- && ((int) (f * pow(10, precision))) != 0) {
f *= 10.0;
c = f;
*ptr++ = '0' + c;
f -= c;
}
}
*ptr = 0;
}