diff options
Diffstat (limited to 'support/libc/libc.c')
-rw-r--r-- | support/libc/libc.c | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/support/libc/libc.c b/support/libc/libc.c new file mode 100644 index 00000000..9b5cfe73 --- /dev/null +++ b/support/libc/libc.c @@ -0,0 +1,158 @@ +#include "locale.h" +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +int errno; + +#define MAXENV 32 +static char *envnames[MAXENV]; +static char *envvars[MAXENV]; + +static void cleanup_libc(void) __attribute__((destructor)); +static void cleanup_libc(void) +{ + int i; + for (i=0; i <MAXENV; i++) { + if (envnames[i]) + free(envnames[i]); + if (envvars[i]) + free(envvars[i]); + } +} + +char * +getenv(const char *name) +{ + int i; + for (i=0; i < MAXENV; i++) { + if (envnames[i] && !strcmp(envnames[i], name)) + return envvars[i]; + } + return NULL; +} + +int +setenv(const char *name, const char *value, int overwrite) +{ + int i; + char *val; + for (i=0; i < MAXENV; i++) { + if (envnames[i] && !strcmp(envnames[i], name)) { + if (overwrite) { + val = strdup(value); + if (!val) + return -1; + if (envvars[i]) + free(envvars[i]); + envvars[i] = val; + } + return 0; + } + } + for (i=0; i < MAXENV; i++) { + if (!envnames[i]) { + envnames[i] = strdup(name); + envvars[i] = strdup(value); + if (!envnames[i] || !envvars[i]) { + if (envnames[i]) + free(envnames[i]); + if (envvars[i]) + free(envvars[i]); + envnames[i] = NULL; + envvars[i] = NULL; + return -1; + } + return 0; + } + } + return -1; +} + +int unsetenv(const char *name) +{ + int i; + for (i=0; i < MAXENV; i++) { + if (envnames[i] && !strcmp(envnames[i], name)) { + free(envnames[i]); + envnames[i] = NULL; + if (envvars[i]) + free(envvars[i]); + envvars[i] = NULL; + } + } + return 0; +} + +char * +getcwd(char *buf, int size) +{ + return "dummy"; +} + +char * +getwd(char *buf) +{ + return "dummy"; +} + +char *strtok_r(char *str, const char *delim, char **saveptr) +{ + return strtok(str, delim); +} + +void +perror(const char *x) +{ +} + +void +raise(void) +{ +} + +void * +popen(void) +{ + return 0; +} + +void +pclose(void) +{ +} + +void +rewind(void) +{ +} + +int +GetThreadLocale(void) +{ + return 0; +} + +int +signal(void) +{ + return 0; +} + +void +setlocale(void) +{ + return 0; +} + +static struct lconv localedata={"."}; + +struct lconv * +localeconv(void) +{ + return &localedata; +} + +unsigned int +alarm(unsigned int seconds) +{ +} |