12 #include <lib/stdio.h>
17 bool stdio_debug =
true;
30 qemu_log(
"Mode is nullptr!");
37 fmode = O_WRITE | O_CREATE;
38 }
else if (
mode[1] ==
'b') {
40 fmode = O_WRITE | O_CREATE;
41 }
else if (
mode[2] ==
'+') {
43 fmode = O_WRITE | O_READ | O_CREATE;
45 fmode = O_WRITE | O_READ | O_CREATE | O_TRUNC;
48 fmode = O_WRITE | O_CREATE | O_TRUNC;
50 }
else if (
mode[1] ==
'+') {
52 fmode = O_WRITE | O_READ | O_CREATE;
53 }
else if (
mode[2] ==
'b') {
55 fmode = O_WRITE | O_READ | O_CREATE;
57 fmode = O_WRITE | O_READ | O_CREATE | O_TRUNC;
60 fmode = O_WRITE | O_READ | O_CREATE | O_TRUNC;
63 fmode = O_WRITE | O_CREATE | O_TRUNC;
65 }
else if (
mode[0] ==
'r') {
68 fmode = O_READ | O_WRITE;
72 }
else if (
mode[1] ==
'+') {
73 fmode = O_READ | O_WRITE;
77 }
else if (
mode[0] ==
'a') {
80 fmode = O_WRITE | O_READ | O_APPEND | O_CREATE;
82 fmode = O_WRITE | O_APPEND | O_CREATE;
84 }
else if (
mode[1] ==
'+') {
85 fmode = O_WRITE | O_READ | O_APPEND | O_CREATE;
87 fmode = O_WRITE | O_APPEND | O_CREATE;
100 qemu_log(
"stream is nullptr!");
104 FSM_FILE finfo = nvfs_info(stream->path);
105 if (finfo.Ready == 0){
106 stream->err = STDIO_ERR_NO_FOUND;
107 }
else if (stream->fmode == 0){
108 stream->err = STDIO_ERR_MODE_ERROR;
109 }
else if (stream->size <= 0){
110 stream->err = STDIO_ERR_SIZE;
111 }
else if (stream->open == 0){
112 stream->err = STDIO_ERR_NO_OPEN;
135 case STDIO_ERR_NO_FOUND:{
136 tty_printf(
"%s: %s\n",s,
"File no found");
139 case STDIO_ERR_MODE_ERROR:{
140 tty_printf(
"%s: %s\n",s,
"Unknown operating mode");
143 case STDIO_ERR_SIZE:{
144 tty_printf(
"%s: %s\n",s,
"The file size has a non-standard value.");
147 case STDIO_ERR_NO_OPEN:{
148 tty_printf(
"%s: %s\n",s,
"The file has not been opened for work.");
152 tty_printf(
"%s: %s\n",s,
"Unknown");
169 return fopen_binmode(filename, freal_mode);
172 FILE* fopen_binmode(
const char* filename,
size_t mode) {
173 ON_NULLPTR(filename, {
174 qemu_log(
"Filename is nullptr!");
178 qemu_log(
"Open file");
179 qemu_log(
"|- Name: '%s'", filename);
180 qemu_log(
"|- Mode: '%x'",
mode);
182 FILE* file = kcalloc(
sizeof(
FILE), 1);
184 FSM_FILE finfo = nvfs_info(filename);
185 if (finfo.Ready == 0 ||
mode == 0) {
187 qemu_err(
"Failed to open file: %s (Exists: %d; FMODE: %d)",
196 file->size = finfo.Size;
197 file->path = kcalloc(
strlen(filename) + 1, 1);
203 qemu_ok(
"File opened!");
232 if (!stream->open || stream->size <= 0 || stream->fmode == 0){
250 int fread(
FILE* stream,
size_t count,
size_t size,
void* buffer){
260 qemu_log(
"Params '%s': count=%d, size=%d, toread=%d, seek=%d", stream->path, count, size, count*size, stream->pos);
263 FSM_FILE finfo = nvfs_info(stream->path);
265 if (!stream->open || finfo.Ready == 0 || stream->size <= 0 || stream->fmode == 0){
271 size_t res = nvfs_read(stream->path, stream->pos, size*count, buffer);
274 stream->pos += size*count;
294 || stream->fmode == 0
296 qemu_err(
"ftell(): invalid stream (open: %d; size: %d; mode: %x)", stream->open, stream->size, stream->fmode);
301 qemu_warn(
"Position is: %d", stream->pos);
303 return (
int)stream->pos;
315 ssize_t
fseek(
FILE* stream, ssize_t offset, uint8_t whence){
316 qemu_log(
"fseek() call\n");
321 qemu_log(
"Stream is not null");
322 if (!stream->open || stream->size == 0 || stream->fmode == 0){
324 qemu_err(
"Seek error: Open: %d; Size: %d; Mode: %x", stream->open, stream->size, stream->fmode);
327 qemu_log(
"Stream is valid");
331 if (whence == SEEK_CUR) {
333 }
else if (whence == SEEK_END) {
335 }
else if (whence == SEEK_SET) {
337 if(offset >= 0 && offset <= stream->size) {
338 stream->pos = offset;
339 qemu_log(
"Whence = SET; Value = %d", offset);
342 qemu_err(
"Invalid offset (whence = 0x0): %x", offset);
345 qemu_err(
"Invalid whence: %d", whence);
349 qemu_warn(
"Offset: %d; Shifting by: %d; Whence = %x", offset, lsk, whence);
350 if (lsk + offset > 0 && stream->size >= lsk+offset){
351 stream->pos = lsk + offset;
367 if (!stream->open || stream->size <= 0 || stream->fmode == 0){
381 size_t fwrite(
FILE *stream,
size_t size,
size_t count,
const void *ptr) {
383 qemu_log(
"stream is nullptr!");
389 if(stream->pos + (size * count) > stream->size) {
390 qemu_warn(
"Out of bounds write!");
395 stream->size = stream->pos + (size * count);
398 size_t res = nvfs_write(stream->path, stream->pos, size*count, ptr);
401 stream->pos += size*count;
uint32_t mode
Режим работы (0 - Обычный | 1 - Режим логирования)
size_t strlen(const char *str)
Возращает длину строки
void * memcpy(void *restrict destination, const void *restrict source, size_t n)
Копирование непересекающихся массивов используя SSE.
void perror(FILE *stream, char *s)
Выводит на экран ошибку с пользовательским сообщением
ssize_t fseek(FILE *stream, ssize_t offset, uint8_t whence)
Установка позиции в потоке данных относительно текущей позиции
void fclose(FILE *stream)
Закончить работу с файлом
uint32_t fmodecheck(const char *mode)
Получение режима работы (маски файла)
size_t fwrite(FILE *stream, size_t size, size_t count, const void *ptr)
Запись файла
void fcheckerror(FILE *stream)
Проверка файла на наличие ошибок при работе
uint32_t ferror(FILE *stream)
Получение кода ошибки
void rewind(FILE *stream)
Установка позиции потока в самое начало
FILE * fopen(const char *filename, const char *_mode)
Открывает файл
int ftell(FILE *stream)
Текущая позиция считывания в файле
int fsize(FILE *stream)
Получение размера файла в байтах
int fread(FILE *stream, size_t count, size_t size, void *buffer)
Чтение файла
Структура файла. Требуется для работы с VFS.