187 lines
3.8 KiB
C
187 lines
3.8 KiB
C
// #include <fatfs/ff.h>
|
|
#include <wuehans_config.h>
|
|
#include <errno.h>
|
|
#include <stdio.h>
|
|
#include <sys/stat.h>
|
|
/* #include <DebugHelper.h> */
|
|
|
|
void *__dso_handle = 0;
|
|
|
|
// const TCHAR STDOUT[30] = "stdout.txt";
|
|
// const TCHAR STDERR[30] = "stderr.txt";
|
|
|
|
// FIL fp = {0};
|
|
// FATFS FatFs = {0};
|
|
// BYTE is_mounted = 0;
|
|
|
|
// struct FD_Data {
|
|
// FIL fp;
|
|
// BYTE mode;
|
|
// BYTE is_open;
|
|
// } FD_Data_default = {NULL, FA_READ, 0};
|
|
// typedef struct FD_Data FD_Data;
|
|
|
|
// #define FILE_AMOUNT 4
|
|
// static FD_Data fd_data[FILE_AMOUNT];
|
|
|
|
// int _write(int fd, char *ptr, int len) {
|
|
// if (is_mounted == 0) {
|
|
// f_mount(&FatFs, "", 0);
|
|
// is_mounted = 1;
|
|
// }
|
|
// // stdout
|
|
// if (fd == 1) {
|
|
|
|
// FIL write_file;
|
|
// FRESULT fr = f_open(&write_file, STDOUT, FA_OPEN_APPEND | FA_WRITE);
|
|
// if (fr != 0) {
|
|
// return fr;
|
|
// }
|
|
|
|
// UINT written = 0;
|
|
|
|
// fr = f_write(&write_file, ptr, len, &written);
|
|
// if (fr != 0) {
|
|
// // TODO: Set errno
|
|
// return -1;
|
|
// }
|
|
|
|
// f_close(&write_file);
|
|
|
|
// // HACK: Hackermann
|
|
// volatile int* x = (int*) 0x80000000;
|
|
// int b = *x;
|
|
// // HACK: Hackermann Ende
|
|
|
|
// return written;
|
|
// } else if (fd > 2 && (fd-3) < FILE_AMOUNT && fd_data[fd-3].is_open) {
|
|
// UINT bw = 0;
|
|
// f_write(&fd_data[fd-3].fp, ptr, len, &bw);
|
|
|
|
// return bw;
|
|
// }
|
|
|
|
// return -1;
|
|
// }
|
|
|
|
// int _read(int fd, char *ptr, int len) {
|
|
// if (fd > 2 && (fd-3) < FILE_AMOUNT && fd_data[fd-3].is_open) {
|
|
// UINT bytesRead = 0;
|
|
// FRESULT result = f_read(&fd_data[fd-3].fp, ptr, len, &bytesRead);
|
|
// /* ScreenPrint("_read"); */
|
|
// return bytesRead;
|
|
// }
|
|
|
|
// return -1;
|
|
// }
|
|
|
|
// void *_sbrk(int incr) {
|
|
// extern int heap_begin;
|
|
// static unsigned char *heap = NULL;
|
|
// unsigned char *prev_heap;
|
|
|
|
// if (heap == NULL) {
|
|
// heap = (unsigned char *)&heap_begin;
|
|
// }
|
|
// prev_heap = heap;
|
|
|
|
// if ((int)heap + incr < heap_begin + HEAP_SIZE) {
|
|
// heap += incr;
|
|
// }
|
|
|
|
// /* ScreenPrint("_sbrk"); */
|
|
// return prev_heap;
|
|
// }
|
|
|
|
// int _fstat(int fd, struct stat *st) {
|
|
// st->st_mode = S_IFREG;
|
|
// /* ScreenPrint("_fstat"); */
|
|
// return 0;
|
|
// }
|
|
|
|
// int _lseek(int fd, int offset, int whence) {
|
|
// // Invalid lseek call
|
|
// if (fd <= 2 || (fd-3) >= FILE_AMOUNT || !fd_data[fd-3].is_open) {
|
|
// return -1;
|
|
// }
|
|
|
|
// // Calculate the correct offset for f_lseek()
|
|
// FSIZE_t ofs = 0;
|
|
// switch (whence) {
|
|
// // Set to offset directly
|
|
// case SEEK_SET:
|
|
// ofs = offset;
|
|
// break;
|
|
|
|
// // Increment by offset
|
|
// case SEEK_CUR:
|
|
// ofs = f_tell(&fd_data[fd-3].fp) + offset;
|
|
// break;
|
|
|
|
// // Append offset to EOF
|
|
// case SEEK_END:
|
|
// ofs = f_size(&fd_data[fd-3].fp) + offset;
|
|
// break;
|
|
// default:
|
|
// return -1;
|
|
// }
|
|
|
|
// FRESULT result = f_lseek(&fd_data[fd-3].fp, ofs);
|
|
// return result;
|
|
// }
|
|
|
|
// int _open(const char *name, int flags, int mode) {
|
|
// if (is_mounted == 0) {
|
|
// f_mount(&FatFs, "", 0);
|
|
// is_mounted = 1;
|
|
// }
|
|
|
|
// int i;
|
|
// for (i = 0; i < FILE_AMOUNT; i++) {
|
|
// if (fd_data[i].is_open == 1) {
|
|
// // Entry already in use
|
|
// continue;
|
|
// }
|
|
// mode = FA_READ;
|
|
// FRESULT fr = f_open(&fd_data[i].fp, name, mode);
|
|
// if (fr != FR_OK) {
|
|
// return -1;
|
|
// }
|
|
|
|
// fd_data[i].mode = mode;
|
|
// fd_data[i].is_open = 1;
|
|
// // Exclude stdout, stderr, stdin
|
|
// return i+3;
|
|
// }
|
|
|
|
// return -1;
|
|
// }
|
|
|
|
// int _close(int fd) {
|
|
// if (fd > 2 && (fd-3) < FILE_AMOUNT) {
|
|
// fd_data[fd-3].is_open = 0;
|
|
// return 0;
|
|
// }
|
|
|
|
// return -1;
|
|
// }
|
|
|
|
int _isatty(int fd)
|
|
{
|
|
errno = ENOTTY;
|
|
/* ScreenPrint("isatty"); */
|
|
return 0;
|
|
}
|
|
|
|
void _exit(int status) {
|
|
while (1) {
|
|
}
|
|
}
|
|
|
|
int _kill(int pid, int sig) {
|
|
errno = EINVAL;
|
|
return -1;
|
|
}
|
|
|
|
int _getpid() { return -1; }
|