create inital version of history
This commit is contained in:
		
							parent
							
								
									c49ed49a0b
								
							
						
					
					
						commit
						a1fef05168
					
				
							
								
								
									
										123
									
								
								History/History.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								History/History.c
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										36
									
								
								History/history.h
									
									
									
									
									
										Normal 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
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user