Добавлены буферы ввода-вывода

This commit is contained in:
Aren Elchinyan 2024-01-14 15:27:52 +03:00
parent 37269c9fba
commit 471ee3cde3
3 changed files with 74 additions and 1 deletions

View File

@ -8,7 +8,7 @@
- [x] Менеджер видеопамяти - [x] Менеджер видеопамяти
- [ ] Менеджер потоков - [ ] Менеджер потоков
- [x] Загрузчик модулей - [x] Загрузчик модулей
- [ ] Буферы ввода-вывода - [X] Буфер ввода-вывода
Модули: Модули:

26
include/io_buf.h Normal file
View File

@ -0,0 +1,26 @@
/**
* io_buf.h
* Заголовок с определениями функций буфера ввода-вывода
*
* Данный заголовочный файл содержит определения которые используются для
* использования буфера ввода-вывода
*
*/
#ifndef IO_BUF_H
#define IO_BUF_H
#include <stdint.h>
typedef struct {
uint8_t *buffer;
uint64_t position;
uint64_t max_size;
} io_buf_t;
io_buf_t *io_buf_create(uint64_t max_size);
void io_buf_destroy(io_buf_t *buffer);
void io_buf_write(io_buf_t *buffer, uint8_t *data, uint64_t length);
uint8_t *io_buf_read(io_buf_t *buffer);
#endif // io_buf.h

47
kernel/io_buf.c Normal file
View File

@ -0,0 +1,47 @@
/**
* io_buf.c
* Функции буфера ввода-вывода
*
* Функционал буфера ввода-вывода
*
*/
#include <io_buf.h>
#include <log.h>
#include <mem.h>
#include <stdint.h>
#include <tool.h>
io_buf_t *io_buf_create(uint64_t max_size) {
io_buf_t *buffer = mem_alloc(sizeof(io_buf_t));
buffer->buffer = mem_alloc(max_size * sizeof(uint8_t));
buffer->position = 0;
buffer->max_size = max_size;
return buffer;
}
void io_buf_destroy(io_buf_t *buffer) {
mem_free(buffer->buffer);
mem_free(buffer);
}
void io_buf_write(io_buf_t *buffer, uint8_t *data, uint64_t length) {
if (buffer->position + length > buffer->max_size) {
LOG("Переполнение буффера\n");
return;
}
tool_memcpy(buffer->buffer + buffer->position, data, length);
buffer->position += length;
}
uint8_t *io_buf_read(io_buf_t *buffer) {
uint8_t *data = mem_alloc((buffer->position + 1) * sizeof(uint8_t));
tool_memcpy(data, buffer->buffer, buffer->position);
data[buffer->position] = '\0';
buffer->position = 0;
tool_memset(buffer->buffer, 0, buffer->max_size);
return data;
}