/contrib/sdk/sources/newlib/libc/Makefile |
---|
2,7 → 2,7 |
AR = kos32-ar |
LD = kos32-ld |
INSTALLDIR:= /home/autobuild/tools/win32/lib |
INSTALLDIR:= /home/autobuild/tools/win32/mingw32 |
CFLAGS = -c -O2 -fno-builtin -fno-ident -fomit-frame-pointer -DMISSING_SYSCALL_NAMES |
LDFLAGS = -shared -s -T libcdll.lds --out-implib libc.dll.a --image-base 0 |
472,6 → 472,15 |
wscanf.c \ |
wsetup.c |
DIRENT_SRCS= dir.c \ |
closedir.c \ |
opendir.c \ |
readdir.c \ |
rewinddir.c \ |
seekdir.c \ |
telldir.c \ |
scandir.c \ |
alphasort.c |
MATH_SRCS = e_acos.c e_acosh.c e_asin.c e_atan2.c e_atanh.c e_cosh.c e_exp.c e_fmod.c \ |
e_hypot.c e_j0.c e_j1.c e_jn.c e_log.c e_log10.c e_pow.c e_rem_pio2.c \ |
529,6 → 538,8 |
STDLIB_OBJS = $(patsubst %.S, stdlib/%.o, $(patsubst %.asm, stdlib/%.o,\ |
$(patsubst %.c, stdlib/%.o, $(STDLIB_SRCS)))) |
DIRENT_OBJS = $(patsubst %.S, dirent/%.o, $(patsubst %.asm, dirent/%.o,\ |
$(patsubst %.c, dirent/%.o, $(DIRENT_SRCS)))) |
MATH_OBJS = $(patsubst %.S, math/%.o, $(patsubst %.asm, math/%.o,\ |
$(patsubst %.c, math/%.o, $(MATH_SRCS)))) |
573,7 → 584,8 |
$(STDLIB_OBJS) \ |
$(STDIO_OBJS) \ |
$(PRINTF_OBJS) \ |
$(MATH_OBJS) |
$(MATH_OBJS) \ |
$(DIRENT_OBJS) |
LIB_OBJS+= time/wcsftime.o |
662,7 → 674,7 |
%.obj : %.asm Makefile |
fasm $< $ |
fasm $< |
%.o : %.c Makefile |
$(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -o $@ $< |
/contrib/sdk/sources/newlib/libc/Tupfile.lua |
---|
454,6 → 454,17 |
"wsetup.c" |
} |
DIRENT_SRCS = { |
"dir.c", |
"closedir.c", |
"opendir.c", |
"readdir.c", |
"rewinddir.c", |
"seekdir.c", |
"telldir.c", |
"scandir.c", |
"alphasort.c", |
} |
MATH_SRCS = { |
"e_acos.c", "e_acosh.c", "e_asin.c", "e_atan2.c", "e_atanh.c", "e_cosh.c", "e_exp.c", "e_fmod.c", |
506,6 → 517,7 |
LIB_SRCS += prepend("stdio/", STDIO_SRCS) |
LIB_SRCS += prepend("string/", STRING_SRCS) |
LIB_SRCS += prepend("stdlib/", STDLIB_SRCS) |
LIB_SRCS += prepend("dirent/", DIRENT_SRCS) |
LIB_SRCS += prepend("math/", MATH_SRCS) |
ALL_OBJS = {} |
/contrib/sdk/sources/newlib/libc/dirent/alphasort.c |
---|
0,0 → 1,7 |
#include <string.h> |
#include <dirent.h> |
int alphasort(const struct dirent **a, const struct dirent **b) |
{ |
return strcoll((*a)->d_name, (*b)->d_name); |
} |
/contrib/sdk/sources/newlib/libc/dirent/closedir.c |
---|
0,0 → 1,14 |
/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ |
#include <sys/dirent.h> |
#include <stdlib.h> |
int closedir(DIR *dir){ |
if(dir == NULL){ |
return -1; |
}else{ |
free(dir->objs); |
free(dir); |
return 0; |
} |
} |
/contrib/sdk/sources/newlib/libc/dirent/dir.c |
---|
0,0 → 1,16 |
/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ |
#include "ksys_fs.h" |
int rmdir(const char* dir){ |
return _ksys_file_delete(dir); |
} |
int mkdir(const char* dir, unsigned fake_mode){ |
return _ksys_mkdir(dir); |
} |
int chdir(char* dir){ |
_ksys_setcwd(dir); |
return 0; |
} |
/contrib/sdk/sources/newlib/libc/dirent/ksys_fs.h |
---|
0,0 → 1,110 |
/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ |
#ifndef _KSYS_FS_H_ |
#define _KSYS_FS_H_ |
#include <stdint.h> |
#include <stddef.h> |
#define asm_inline __asm__ __volatile__ |
#pragma pack(push,1) |
typedef struct{ |
unsigned p00; |
union{ |
uint64_t p04; |
struct { |
unsigned p04dw; |
unsigned p08dw; |
}; |
}; |
unsigned p12; |
union { |
unsigned p16; |
const char *new_name; |
void *bdfe; |
void *buf16; |
const void *cbuf16; |
}; |
char p20; |
const char *p21; |
}ksys70_t; |
typedef struct { |
unsigned attributes; |
unsigned name_cp; |
char creation_time[4]; |
char creation_date[4]; |
char last_access_time[4]; |
char last_access_date[4]; |
char last_modification_time[4]; |
char last_modification_date[4]; |
unsigned long long size; |
char name[0]; |
}ksys_bdfe_t; |
#pragma pack(pop) |
static inline |
int _ksys_work_files(const ksys70_t *k) |
{ |
int status; |
asm_inline( |
"int $0x40" |
:"=a"(status) |
:"a"(70), "b"(k) |
:"memory" |
); |
return status; |
} |
static inline |
int _ksys_file_delete(const char *name) |
{ |
ksys70_t k; |
k.p00 = 8; |
k.p20 = 0; |
k.p21 = name; |
return _ksys_work_files(&k); |
} |
static inline |
int _ksys_mkdir(const char *path) |
{ |
ksys70_t dir_opt; |
dir_opt.p00 = 9; |
dir_opt.p21 = path; |
return _ksys_work_files(&dir_opt); |
} |
static inline |
void _ksys_setcwd(char* dir){ |
asm_inline( |
"int $0x40" |
::"a"(30), "b"(1), "c"(dir) |
); |
} |
static inline |
void* _ksys_alloc(size_t size){ |
void *val; |
asm_inline( |
"int $0x40" |
:"=a"(val) |
:"a"(68),"b"(12),"c"(size) |
); |
return val; |
} |
static inline |
int _ksys_free(void *mem) |
{ |
int val; |
asm_inline( |
"int $0x40" |
:"=a"(val) |
:"a"(68),"b"(13),"c"(mem) |
); |
return val; |
} |
#endif |
/contrib/sdk/sources/newlib/libc/dirent/opendir.c |
---|
0,0 → 1,53 |
/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ |
#include <sys/dirent.h> |
#include "ksys_fs.h" |
#include <errno.h> |
#include <stdlib.h> |
#include <string.h> |
#define CHECK_DIR_ERR() if(_ksys_work_files(&inf)){ \ |
free((void*)inf.p16); \ |
errno = ENOTDIR; \ |
return NULL; \ |
} |
DIR* opendir(const char* path) |
{ |
DIR* list = malloc(sizeof(DIR)); |
if(list==NULL){ |
errno = ENOMEM; |
return NULL; |
} |
list->pos=0; |
unsigned num_of_file=0; |
static ksys70_t inf; |
inf.p00 = 1; |
inf.p04 = 0; |
inf.p12 = 2; |
inf.p16 = (unsigned) malloc(32+inf.p12*560); |
inf.p20 = 0; |
inf.p21 = (char*)path; |
CHECK_DIR_ERR(); |
num_of_file = *(unsigned*)(inf.p16+8); |
inf.p12 = num_of_file; |
free((void*)inf.p16); |
inf.p16 = (unsigned)_ksys_alloc(32+inf.p12*560); |
list->objs = (struct dirent*) malloc(num_of_file*sizeof(struct dirent)); |
CHECK_DIR_ERR(); |
for(int i=0; i<num_of_file; i++){ |
list->objs[i].d_ino = i; |
list->objs[i].d_type = *(unsigned*)(inf.p16+32+(264+40)*i); |
strcpy(list->objs[i].d_name,(char*)(inf.p16+32+40+(264+40)*i)); |
} |
list->num_objs = num_of_file; |
return list; |
} |
/contrib/sdk/sources/newlib/libc/dirent/readdir.c |
---|
0,0 → 1,14 |
/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ |
#include <sys/dirent.h> |
#include <stdlib.h> |
struct dirent* readdir(DIR *dir) |
{ |
if(dir->num_objs>dir->pos){ |
dir->pos++; |
return &dir->objs[dir->pos-1]; |
}else{ |
return NULL; |
} |
} |
/contrib/sdk/sources/newlib/libc/dirent/rewinddir.c |
---|
0,0 → 1,9 |
/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ |
#include <sys/dirent.h> |
void rewinddir(DIR *dir){ |
if(dir!=NULL){ |
dir->pos=0; |
} |
} |
/contrib/sdk/sources/newlib/libc/dirent/scandir.c |
---|
0,0 → 1,46 |
#include <dirent.h> |
#include <string.h> |
#include <stdlib.h> |
#include <errno.h> |
#include <stddef.h> |
#define SIZE_MAX 256 |
int scandir(const char *path, struct dirent ***res, |
int (*sel)(const struct dirent *), |
int (*cmp)(const struct dirent **, const struct dirent **)) |
{ |
DIR *d = opendir(path); |
struct dirent *de, **names=0, **tmp; |
size_t cnt=0, len=0; |
int old_errno = errno; |
if (!d) return -1; |
while ((errno=0), (de = readdir(d))) { |
if (sel && !sel(de)) continue; |
if (cnt >= len) { |
len = 2*len+1; |
if (len > SIZE_MAX/sizeof *names) break; |
tmp = realloc(names, len * sizeof *names); |
if (!tmp) break; |
names = tmp; |
} |
names[cnt] = malloc(sizeof(struct dirent)); |
if (!names[cnt]) break; |
memcpy(names[cnt++], de, sizeof(struct dirent)); |
} |
closedir(d); |
if (errno) { |
if (names) while (cnt-->0) free(names[cnt]); |
free(names); |
return -1; |
} |
errno = old_errno; |
if (cmp) qsort(names, cnt, sizeof *names, (int (*)(const void *, const void *))cmp); |
*res = names; |
return cnt; |
} |
/contrib/sdk/sources/newlib/libc/dirent/seekdir.c |
---|
0,0 → 1,12 |
/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ |
#include <sys/dirent.h> |
void seekdir(DIR *dir, unsigned pos) |
{ |
if(dir==NULL || pos>dir->num_objs){ |
return; |
} |
dir->pos=pos; |
return; |
} |
/contrib/sdk/sources/newlib/libc/dirent/telldir.c |
---|
0,0 → 1,12 |
/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ |
#include <sys/dirent.h> |
unsigned telldir(DIR *dir) |
{ |
if(dir!=NULL){ |
return dir->pos; |
}else{ |
return 0; |
} |
} |
/contrib/sdk/sources/newlib/libc/include/sys/dir.h |
---|
7,4 → 7,8 |
#define direct dirent |
extern int chdir(char* dir); |
extern int rmdir(const char* dir); |
extern int mkdir(const char* dir, unsigned fake_mode); |
#endif /*_SYS_DIR_H_*/ |
/contrib/sdk/sources/newlib/libc/include/sys/dirent.h |
---|
8,25 → 8,34 |
extern "C" { |
#endif |
#define DT_DIR 16 |
#define DT_REG 0 |
#include <limits.h> |
#include <sys/types.h> |
struct dirent { |
char d_namlen; |
ino_t d_ino; |
unsigned d_type; |
char d_name[256]; |
}; |
typedef struct |
{ |
// struct systree_info2 fileinfo; |
struct dirent entry; |
// __u8 bdfeheader[0x20]; |
// struct bdfe_item bdfebase; |
// __u8 bdfename[264]; |
typedef struct{ |
struct dirent* objs; |
ino_t pos; |
ino_t num_objs; |
} DIR; |
int closedir(DIR *dirp); |
DIR * opendir(const char *_dirname); |
struct dirent * readdir(DIR *_dirp); |
void rewinddir(DIR *_dirp); |
extern int closedir(DIR *dir); |
extern DIR* opendir(const char *path); |
extern struct dirent* readdir(DIR *); |
extern void rewinddir(DIR *dir); |
extern void seekdir(DIR *dir, unsigned pos); |
extern unsigned telldir(DIR *dir); |
extern int scandir(const char *path, struct dirent ***res, int (*sel)(const struct dirent *), int (*cmp)(const struct dirent **, const struct dirent **)); |
extern int alphasort(const struct dirent **a, const struct dirent **b); |
#ifdef __cplusplus |
} |
#endif |
/contrib/sdk/sources/newlib/libc/libc.def |
---|
507,3 → 507,14 |
y1f |
yn |
ynf |
alphasort |
opendir |
closedir |
readdir |
rewinddir |
seekdir |
telldir |
scandir |
mkdir |
rmdir |
chdir |