// #include #include #include #include #include /* #include */ 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; }