create inital version of history

This commit is contained in:
Laila van Reenen 2024-04-13 17:37:49 +02:00
parent c49ed49a0b
commit a1fef05168
2 changed files with 159 additions and 0 deletions

123
History/History.c Normal file
View File

@ -0,0 +1,123 @@
#include "FIFOBuffChar.h"
#include <stdlib.h>
#include <stddef.h>
#include <stdio.h>
History_t* History_init()
{
History_t* history = malloc(sizeof(FIFOBuffChar_t));
if (history != NULL) {
history->FirstEl_p = NULL;
history->LastEl_p = NULL;
history->size = 0;
}
return history;
}
int History_deinit(History_t* history)
{
// Check if the buffer there is something in the buffer
if (history->FirstEl_p == NULL)
{
// Delete all elements in the buffer
History_element_t* el = history->FirstEl_p;
while (el != NULL)
{
FIFOBuffChar_element_t* nextEl = el->nextEl;
free(el);
el = nextEl;
}
}
free(history);
return 0;
}
int History_put(History_t *history, char* line)
{
int retCode;
if ((history->LastEl_p == NULL) && (history->FirstEl_p == NULL))
{
// buffer is empty. add first element
history->FirstEl_p = malloc(sizeof(History_element_t));
if (history->FirstEl_p != NULL)
{
history->FirstEl_p->line = line;
history->FirstEl_p->prev_p = NULL;
history->FirstEl_p->next_p = NULL;
history->LastEl_p = history->FirstEl_p;
history->size = 1;
retCode = 0;
}
else
{ // failt to allocate memory
retCode = -1;
}
}
else if ((history->LastEl_p != NULL) && (history->FirstEl_p != NULL))
{
// add element to exsiting buffer
History_element_t* el = malloc(sizeof(History_element_t));
if (el != NULL)
{
el->character = i; // "value" to "character"
el->PrevEl_p = history->LastEl_p;
el->nextEl_p = NULL;
history->LastEl_p->nextEl_p = el;
history->LastEl_p = el;
history->size++;
retCode = 0;
}
else
{ // failt to allocate memory
retCode = -2;
}
}
else
{
retCode = -3;
}
if (retCode >= 0)
{
// reset current pointer
history->currEl_p = NULL;
}
return retCode;
}
int History_getPrev(History_t* history, char** line)
{
int retCode;
if (history->currEl_p != NULL)
{
history->currEl_p = history->LastEl_p;
}
else
{
history->currEl_p = history->currEl_p->PrevEl_p;
}
if (history->currEl_p != NULL)
{
*line = history->currEl_p->line;
retCode = 0;
}
else
{
*line = NULL;
retCode = -1;
}
return 0;
}
unsigned int History_getSize(History_t *history)
{
return history->size;
}

36
History/history.h Normal file
View File

@ -0,0 +1,36 @@
#ifndef HISTORY_H
#define HISTORY_H
#include <stdbool.h>
// one element in the buffer
typedef struct History_element_s {
void* prevEl_p;
char* line;
void* nextEl_p;
} History_element_t;
// defines all vars for the buffer to operate
typedef struct History_s {
History_element_t* FirstEl_p;
History_element_t* LastEl_p;
History_element_t* CurrEl_p;
unsigned char size;
} History_t;
// create a fifo buffer and initilizes it with zeros
extern History_t* History_init();
// destroy a fifo buffer (free up its space)
extern int History_deinit(History_t* history);
// put value i in buffer if there is still memory avaliable
extern int History_put(History_t *history, char* line);
// get value from buffer and writes it to *line
extern int History_getPrev(History_t* history, char** line);
extern int History_getNext(History_t* history, char** line);
extern unsigned int History_getSize(History_t *history);
#endif