More libc for Python (almost done)

This commit is contained in:
K. Lange 2018-06-25 15:45:32 +09:00
parent a404c0f0af
commit 5cd281a1a6
15 changed files with 129 additions and 4 deletions

View File

@ -1 +1,5 @@
#ifdef DEBUG
#define assert(statement) ((statement) ? (void)0 : __assert_func(__FILE__, __LINE__, __FUNCTION__, #statement))
#else
#define assert(statement) ((void)0)
#endif

View File

@ -11,11 +11,21 @@
#define O_EXCL 0x0800
#define O_NOFOLLOW 0x1000
#define O_PATH 0x2000
#define O_NONBLOCK 0x4000
#define F_OK 1
#define R_OK 4
#define W_OK 2
#define X_OK 1
#define F_GETFD 1
#define F_SETFD 2
#define F_GETFL 3
#define F_SETFL 4
#define FD_CLOEXEC (1 << 0)
extern int open (const char *, int, ...);
extern int chmod(const char *path, mode_t mode);
extern int fcntl(int fd, int cmd, ...);

View File

@ -12,3 +12,4 @@ typedef _sig_func_ptr sighandler_t;
typedef int sig_atomic_t;
extern sighandler_t signal(int signum, sighandler_t handler);
extern int raise(int sig);

View File

@ -32,9 +32,10 @@ extern int fflush(FILE * stream);
extern size_t vasprintf(char ** buf, const char *fmt, va_list args);
extern int sprintf(char *buf, const char *fmt, ...);
extern int fprintf(FILE *stream, char *fmt, ...);
extern int printf(char *fmt, ...);
extern int fprintf(FILE *stream, const char *fmt, ...);
extern int printf(const char *fmt, ...);
extern int snprintf(char * buf, size_t size, const char * fmt, ...);
extern int vsprintf(char * buf, const char *fmt, va_list args);
extern int puts(const char *s);
extern int fputs(const char *s, FILE *stream);

View File

@ -36,6 +36,7 @@ extern int atoi(const char * s);
extern char * strcat(char *dest, const char *src);
extern char * strtok(char * str, const char * delim);
extern char * strtok_r(char * str, const char * delim, char ** saveptr);
extern char * strncpy(char *dest, const char *src, size_t n);

View File

@ -3,3 +3,9 @@
#include <stddef.h>
extern int wcwidth(wchar_t c);
extern wchar_t * wcsncpy(wchar_t * dest, const wchar_t * src, size_t n);
extern size_t wcslen(const wchar_t * s);
extern int wcscmp(const wchar_t *s1, const wchar_t *s2);
extern wchar_t * wcscat(wchar_t *dest, const wchar_t *src);
typedef unsigned int wint_t;

6
libc/signal/raise.c Normal file
View File

@ -0,0 +1,6 @@
#include <signal.h>
#include <unistd.h>
int raise(int sig) {
return kill(getpid(), sig);
}

View File

@ -208,7 +208,11 @@ size_t vasprintf(char ** buf, const char * fmt, va_list args) {
return xvasprintf(b, fmt, args);
}
int fprintf(FILE * device, char *fmt, ...) {
int vsprintf(char * buf, const char *fmt, va_list args) {
return xvasprintf(buf, fmt, args);
}
int fprintf(FILE * device, const char *fmt, ...) {
va_list args;
va_start(args, fmt);
char * buffer;
@ -220,7 +224,7 @@ int fprintf(FILE * device, char *fmt, ...) {
return out;
}
int printf(char *fmt, ...) {
int printf(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
char * buffer;

View File

@ -391,6 +391,28 @@ int atoi(const char * s) {
return neg ? n : -n;
}
long int strtol(const char * s, char **endptr, int base) {
int n = 0;
int neg = 0;
while (isspace(*s)) {
s++;
}
switch (*s) {
case '-':
neg = 1;
/* Fallthrough is intentional here */
case '+':
s++;
}
while (isdigit(*s)) {
n = 10*n - (*s++ - '0');
}
/* The sign order may look incorrect here but this is correct as n is calculated
* as a negative number to avoid overflow on INT_MAX.
*/
return neg ? n : -n;
}
size_t lfind(const char * str, const char accept) {
return (size_t)strchr(str, accept);
}
@ -420,6 +442,14 @@ char * strtok_r(char * str, const char * delim, char ** saveptr) {
return token;
}
char * strtok(char * str, const char * delim) {
static char * saveptr = NULL;
if (str) {
saveptr = NULL;
}
return strtok_r(str, delim, &saveptr);
}
char * strcat(char *dest, const char *src) {
char * end = dest;
while (*end != '\0') {

11
libc/unistd/fcntl.c Normal file
View File

@ -0,0 +1,11 @@
#include <fcntl.h>
int fcntl(int fd, int cmd, ...) {
switch (cmd) {
case F_GETFD:
return 0;
case F_SETFD:
return 0;
}
return -1;
}

15
libc/wchar/wcscat.c Normal file
View File

@ -0,0 +1,15 @@
#include <wchar.h>
wchar_t * wcscat(wchar_t *dest, const wchar_t *src) {
wchar_t * end = dest;
while (*end != 0) {
++end;
}
while (*src) {
*end = *src;
end++;
src++;
}
*end = 0;
return dest;
}

6
libc/wchar/wcscmp.c Normal file
View File

@ -0,0 +1,6 @@
#include <wchar.h>
int wcscmp(const wchar_t *l, const wchar_t *r) {
for (; *l == *r && *l; l++, r++);
return *(unsigned int *)l - *(unsigned int *)r;
}

7
libc/wchar/wcscpy.c Normal file
View File

@ -0,0 +1,7 @@
#include <wchar.h>
wchar_t * wcscpy(wchar_t * restrict dest, const wchar_t * restrict src) {
wchar_t * out = dest;
for (; (*dest=*src); src++, dest++);
return out;
}

10
libc/wchar/wcslen.c Normal file
View File

@ -0,0 +1,10 @@
#include <wchar.h>
size_t wcslen(const wchar_t * s) {
size_t out = 0;
while (*s) {
out++;
s++;
}
return out;
}

13
libc/wchar/wcsncpy.c Normal file
View File

@ -0,0 +1,13 @@
#include <wchar.h>
wchar_t * wcsncpy(wchar_t * dest, const wchar_t * src, size_t n) {
wchar_t * out = dest;
while (n > 0) {
if (!*src) break;
*dest = *src;
dest++;
src++;
n--;
}
return out;
}