Skip to content

Commit a7e5b0d

Browse files
jar3mBlindCentaur
andauthored
Link List & Common Libs (#15)
* Configuring build for link -list * Added struct def to linklist * Commit Logs - Added backtrace on coredump - changed declaration of del_mem to free_mem - added/cleaned up link_list struct and function def * Create/destroy Link List api' * Defs.make updated to select tuning params * moved t_elem datatype to common * Added get_node and added rule for stacks * Add end fn (append) defined for SLL,DLL,SCLL,DCLL * added add_begin functions for SLL,DLL,SCLL,DCLL * Stack structure definition * stack source file created * added full, empty and size fn declartions to stacks * adding delete functions to link list * Stack structure definition * stack source file created * added full, empty and size fn declartions to stacks * updated stack structure * - Cosmetic changes: Added Function headers and comments - Bug fixed in Add begin tail ptr not being updated - Tail & Head ptr not set to NULL in after del resulting in empty list causing corruption of data on reusing the list * COMMIT DETAILS - Enabled Generic support for link list - Added generic_def.h/c as helper functions for data type generic lists - Added Comments - Test file updated to show link list of diff types such as char, int, float and string - All link list operations are now data type independent * Commit Logs - Fixed bug in delete in SLL * Moved free fn ptr defn to typedefs.h * Added generic print for data * changed generic fn routines * cosmetics * Generic ptr compare added to link list * WIP : Added index delete and xor based linked list * fixed xor ll delete * print for XOR LL and fixed compilation issues * added function ptr for destroy and print in linklist * rectified del_idx and added tests, WIP: Circular count is incorrect * moved destroy to end * Commit Logs - Added new struct to be passed along create that populates data type spefic fn ptrs required for maintaining data struct - two different links for just printing the data and the other for getting detailed info of linklist inlcuding count , addresses and links * Commit Logs - Added generic fn ptrs - Defined get head, tail, end, next and prv fn ptrs in ll struct implementation to be done - defined get and find node struct in ll - fn names changed and cosmetic changes * * defined api's for ll head, tail, end, prev and next * changed destroy and print api's using head, end and next ll routines * TODO implement the above 2 points for xor link list * cosmetics funtion headers and indentations * Added get next and prev for xor ll. works only when iterating from start to end o f list not otherwise Del node and del i th node in xor ll need to be debugged * added find function for linked list * added get ith node function in the linked list * Cosmetic changes for Doxygen support - Added function headers - Added Structure feild descriptions - Added File headers - Added Macro and Enums description comments * Added util api for printing link_list type * Del node xor list fixed * cosmetics * added delete index for xor link list * Test link list clean up * Added Link list get data routine Co-authored-by: BlindCentaur <harsha.dev21@gmail.com>
1 parent 56a19ce commit a7e5b0d

27 files changed

+2313
-62
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,6 @@ modules.order
5050
Module.symvers
5151
Mkfile.old
5252
dkms.conf
53+
54+
#tags
55+
tags

Defs.make

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,25 @@
66
#All defines to be explained in docs/testing_framework.txt
77

88
PROJ_PATH=$(PWD)
9+
LIB_NAME=c_everyting.so
10+
11+
#which Modules to build
912
MODULE=test
1013

14+
#build type
15+
BUILD_TYPE=executable
16+
#BUILD_TYPE=library
17+
18+
#flags
19+
SEGFAULT_BACKTRACE=true
20+
#include submodules of Data structures
21+
LINK_LIST=true
22+
STACK=false
23+
1124
.show:
1225
@echo "PROJ_PATH= $(PROJ_PATH)"
26+
@echo "LIB_NAME=$(LIB_NAME)"
1327
@echo "MODULE= $(MODULE)"
28+
@echo "BUILD_TYPE=$(BUILD_TYPE)"
29+
@echo "LINK_LIST= $(LINK_LIST)"
30+
@echo "STACKS= $(STACK)"

Makefile

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ include Defs.make
33
CC=gcc
44
TEST_FILE_DIRECTORY="$(PROJ_PATH)/test/src"
55

6-
LDLIBS= -lm -pg
6+
LDLIBS= -lm -pg
7+
ifeq ($(SEGFAULT_BACKTRACE), true)
8+
LDLIBS+=-rdynamic
9+
endif
710
INCLUDES+=-I $(PROJ_PATH)/ds/inc
811
INCLUDES+=-I $(PROJ_PATH)/common/inc
912
INCLUDES+=-I $(PROJ_PATH)/test/inc
@@ -24,6 +27,7 @@ MODULE_ARCHIVES += $(algo_ARCHIVE)
2427
endif
2528

2629
ifeq ($(MODULE), test)
30+
MODULE_ARCHIVES += $(ds_ARCHIVE)
2731
MODULE_ARCHIVES += $(test_ARCHIVE)
2832
endif
2933

@@ -37,7 +41,11 @@ export
3741

3842
all: $(MODULE_ARCHIVES)
3943
@echo "All archives ($(MODULE_ARCHIVES)) created"
40-
$(CC) $(INCLUDES) $^ -o foo.out $(MODULE_ARCHIVES) $(LDLIBS) $(CFLAGS)
44+
ifeq ($(BUILD_TYPE), executable)
45+
$(CC) $(INCLUDES) $^ -o foo.out $(MODULE_ARCHIVES) $(LDLIBS) $(CFLAGS)
46+
else ifeq ($(BUILD_TYPE), library)
47+
$(CC) -shared -o $(LIB_NAME) $(MODULE_ARCHIVES) $(LDLIBS) $(CFLAGS)
48+
endif
4149

4250
$(common_ARCHIVE) :
4351
make -C common/ all
@@ -55,9 +63,10 @@ $(test_ARCHIVE) :
5563

5664
clean:
5765
make -C test/ clean
58-
# make -C ds/ clean
66+
make -C ds/ clean
5967
find ${PROJ_PATH} -name "*.[ao]" -exec rm -v {} \;
6068
find ${PROJ_PATH} -name "*.out" -exec rm -v {} \;
69+
find ${PROJ_PATH} -name "*.so" -exec rm -v {} \;
6170

6271

6372

common/Makefile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,16 @@ fault_SRC=src/fault_manager.c
1414
fault_OBJ=bin/fault_manager.o
1515

1616

17+
generic_SRC=src/generic_def.c
18+
generic_OBJ=bin/generic_def.o
19+
1720
common_ARCHIVE=$(PROJ_PATH)/common/bin/common.a
1821

1922
OBJS=$(common_OBJ)
2023
OBJS+=$(logger_OBJ)
2124
OBJS+=$(mem_OBJ)
2225
OBJS+=$(fault_OBJ)
26+
OBJS+=$(generic_OBJ)
2327

2428

2529
$(common_OBJ): $(common_SRC)
@@ -34,6 +38,9 @@ $(mem_OBJ): $(mem_SRC)
3438
$(fault_OBJ): $(fault_SRC)
3539
$(CC) $(INCLUDES) -c $^ -o $@ $(CFLAGS)
3640

41+
$(generic_OBJ): $(generic_SRC)
42+
$(CC) $(INCLUDES) -c $^ -o $@ $(CFLAGS)
43+
3744
all: $(OBJS)
3845
@echo "building common"
3946
ar rcs $(common_ARCHIVE) $(OBJS)

common/inc/common.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,36 @@
1+
/*! @file common.h
2+
@brief
3+
Top level include containg common headers
4+
*/
5+
#pragma once
6+
17
#include "os.h"
28
#include "typedefs.h"
39
#include "logger.h"
410
#include "memory_manager.h"
511
#include "fault_manager.h"
12+
#include "generic_def.h"
13+
14+
/*! data params struct to be passed to all data structures
15+
* it holds functions pointers for operating on data depending on type of it
16+
*/
17+
/// data params struct defn
18+
typedef struct data_params {
19+
// type of datatypes
20+
e_data_types type; ///< Holds elem data type
21+
22+
// data type specific routines
23+
f_cmpr cmpr; ///< Routine used for comparing two given elems of said type
24+
f_assign assign; ///< Routine used for creating memory for storing the data
25+
f_swap swap; ///< Routine used for swaping two elemnts of goven data
26+
f_free free; ///< Routine used for freeing elements of said data
27+
f_cmp_idx cmp_idx; ///< Routine used for comparing elems in given array indicies
28+
f_swp_idx swp_idx; ///< Routine used for swapring elems in given array indicies
29+
f_cpy_idx cpy_idx; ///< Routine used for copying elems in given array indicies
30+
f_get_idx get_idx; ///< Routine used for getting elem in given array index
31+
f_print print_data; ///< Routine used for printing elem data
32+
} t_dparams;
33+
34+
void init_data_params(t_dparams*, e_data_types);
35+
636

common/inc/fault_manager.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
1+
/*! @file fault_manager.h
2+
@brief
3+
Contains declarations of fault manager routines
4+
*/
5+
16
#pragma once
7+
28
#include <os.h>
39

4-
typedef void (*f_fault_handle)(int,siginfo_t *,void *);
10+
/// Function pointer for fault handler
11+
typedef void (*f_fault_handle)(int, siginfo_t *, void *);
512

613

714
void fault_manager_init(f_fault_handle h);

common/inc/generic_def.h

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
/*! @file generic_def.h
2+
@brief
3+
Contains Macros that are used for defining psuedo data template functions
4+
*/
5+
#pragma once
6+
7+
#include "typedefs.h"
8+
#include "memory_manager.h"
9+
10+
/// Template Compare function for default data types
11+
#define CMPR(T, NAME) e_cmpr NAME(t_gen x, t_gen y)\
12+
{ \
13+
e_cmpr ret = eEQUAL;\
14+
T tmp = (*((T*)(x))) - (*((T*)(y)));\
15+
if (tmp < 0) \
16+
ret = eLESS;\
17+
else if (tmp > 0)\
18+
ret = eGREAT;\
19+
return ret;\
20+
}
21+
22+
23+
/// Template Assign memory function for default data types
24+
#define ASSGN(T, NAME) t_gen NAME(T y) \
25+
{\
26+
t_gen x = get_mem(1, sizeof(T));\
27+
*((T*)x) = y;\
28+
return x;\
29+
}
30+
31+
32+
/// Template Swap function for default data types
33+
#define SWAP(T, NAME) void NAME(t_gen x, t_gen y) \
34+
{\
35+
T tmp = *((T*)x);\
36+
*((T*)x) = *((T*)y);\
37+
*((T*)y) = tmp;\
38+
}
39+
40+
/// Defines format specfier depending on type of data
41+
/// used for implementing generic print
42+
/// Note: Requires C11 compiler since it use _Generic
43+
#define FMT_SPF(T) _Generic((T),\
44+
char: "%c", \
45+
signed char: "%hhd", \
46+
unsigned char: "%hhu", \
47+
signed short: "%hd", \
48+
unsigned short: "%hu", \
49+
signed int: "%d", \
50+
unsigned int: "%u", \
51+
long int: "%ld", \
52+
unsigned long int: "%lu", \
53+
long long int: "%lld", \
54+
unsigned long long int: "%llu", \
55+
float: "%f", \
56+
double: "%f", \
57+
long double: "%Lf", \
58+
char *: "%s", \
59+
void *: "%p")
60+
61+
62+
/// Template print function for default data types
63+
#define PRINT_GEN(T, NAME) void NAME(t_gen x) \
64+
{ \
65+
T y;\
66+
printf(FMT_SPF(y), *((T*)x)); \
67+
}
68+
69+
/// Template function for comparing elemts at given indicies of an array for default data types
70+
#define CMPR_IDX(T, NAME) e_cmpr NAME(t_gen x, int idx1, int idx2)\
71+
{ \
72+
e_cmpr ret = eEQUAL;\
73+
T *arr = ((T*)(x));\
74+
T tmp = arr[idx1] -arr[idx2];\
75+
if (tmp < 0) \
76+
ret = eLESS;\
77+
else if (tmp > 0)\
78+
ret = eGREAT;\
79+
return ret;\
80+
}
81+
82+
/// Template function for swaping elemts at given indicies of an array for default data types
83+
#define SWP_IDX(T, NAME) void NAME(t_gen x, int idx1, int idx2)\
84+
{ \
85+
T *arr = ((T*)(x));\
86+
T tmp = arr[idx1] ;\
87+
arr[idx1] = arr[idx2];\
88+
arr[idx2] = tmp;\
89+
}
90+
91+
/// Template function for copying element to a given index of an array for default data types
92+
#define COPY_IDX(T, NAME) void NAME(t_gen x, int idx1, t_gen data)\
93+
{ \
94+
T *arr = ((T*)(x));\
95+
arr[idx1] = *((T*)(data));\
96+
}
97+
98+
/// Template function for getting element at a given index of an array for default data types
99+
#define GET_IDX(T, NAME) t_gen NAME(t_gen x, int idx1)\
100+
{ \
101+
T *arr = ((T*)(x));\
102+
t_gen tmp = &arr[idx1] ;\
103+
return tmp;\
104+
}
105+
106+
/// Below routines defined as reference for basic datatypes
107+
e_cmpr compare_char(t_gen,t_gen);
108+
e_cmpr compare_int(t_gen,t_gen);
109+
e_cmpr compare_float(t_gen,t_gen);
110+
e_cmpr compare_string(t_gen,t_gen);
111+
e_cmpr compare_gen(t_gen,t_gen);
112+
113+
t_gen assign_char(char);
114+
t_gen assign_int(int);
115+
t_gen assign_float(float);
116+
t_gen assign_string(char*);
117+
t_gen assign_gen(t_gen);
118+
119+
void swap_char(t_gen,t_gen);
120+
void swap_int(t_gen,t_gen);
121+
void swap_float(t_gen,t_gen);
122+
void swap_string(t_gen,t_gen);
123+
void swap_gen(t_gen,t_gen);
124+
125+
void print_char(t_gen);
126+
void print_float(t_gen);
127+
void print_int(t_gen);
128+
void print_str(t_gen);
129+
void print_gen(t_gen);
130+
131+
e_cmpr compare_idx_char(t_gen,int,int);
132+
e_cmpr compare_idx_int(t_gen,int,int);
133+
e_cmpr compare_idx_float(t_gen,int,int);
134+
135+
void swap_idx_char(t_gen,int,int);
136+
void swap_idx_int(t_gen,int,int);
137+
void swap_idx_float(t_gen,int,int);
138+
139+
void copy_idx_char(t_gen,int,t_gen);
140+
void copy_idx_int(t_gen,int,t_gen);
141+
void copy_idx_float(t_gen,int,t_gen);
142+
143+
t_gen get_idx_char(t_gen,int);
144+
t_gen get_idx_int(t_gen,int);
145+
t_gen get_idx_float(t_gen,int);

common/inc/logger.h

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
1-
#ifndef _LOGGER_H
2-
#define _LOGGER_H
1+
/*! @file logger.h
2+
@brief
3+
Defines Macros for logging
4+
*/
5+
#pragma once
36

4-
#define __LOG_ERROR__ 0
5-
#define __LOG_WARN__ 1
6-
#define __LOG_INFO__ 2
7-
#define __LOG_DEBUG__ 3
8-
#define __LOG_TRACE__ 4
7+
#define __LOG_ERROR__ 0 ///< log level Error
8+
#define __LOG_WARN__ 1 ///< log level Warn
9+
#define __LOG_INFO__ 2 ///< log level Info
10+
#define __LOG_DEBUG__ 3 ///< log level Debug
11+
#define __LOG_TRACE__ 4 ///< log level Trace
912

10-
#define MAX_LOG_LEVELS 5
11-
#define MAX_MODULES 4
13+
#define MAX_LOG_LEVELS 5
14+
#define MAX_MODULES 4
1215
#define COMMON_MODULE 1
1316

1417
#define LOG_ERROR(mod,fmt, args...) app_log(mod, __LOG_ERROR__, NULL, fmt, ##args)
@@ -21,4 +24,3 @@
2124
void logger_init();
2225
int app_log(char *module, int level, char *prefix, const char *format, ...);
2326

24-
#endif // End of _LOGGER_H

common/inc/memory_manager.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
1+
/*! @file memory_manager.h
2+
@brief
3+
Contains decalration of structures for maintaing all mem alloc and frees
4+
*/
5+
16
#pragma once
27

38
#define get_mem(nmemb, size) tag_alloc(nmemb, size, __FILE__, __LINE__)
4-
#define del_mem(mem_addr) untag_alloc(mem_addr, __FILE__, __LINE__)
9+
#define free_mem(mem_addr) untag_alloc(mem_addr, __FILE__, __LINE__)
10+
#define FREE_MEM untag_alloc
511

612
typedef struct memory_record
713
{
814
void *mem;
9-
size_t nmemb;
15+
size_t nmemb;
1016
size_t block_size;
1117
char *file;
1218
int line;

common/inc/os.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
1+
/*! @file os.h
2+
@brief
3+
Used for including os specific headers
4+
*/
5+
#pragma once
6+
17
#include <stdio.h>
28
#include <stdlib.h>
39
#include <stdint.h>
410
#include <stdbool.h>
511
#include <stdarg.h>
612
#include <string.h>
13+
#include <unistd.h>
714
#include <assert.h>
815
#include <pthread.h>
916
#include <signal.h>
1017
#include <sys/time.h>
1118

12-
19+
/// Custom malloc if not defined use calloc and free
1320
#ifndef CUSTOM_MALLOC
1421
#define os_alloc(nmemb, size) calloc((nmemb), (size))
1522
#define os_free(mem_addr) free((mem_addr))
16-
17-
#endif
23+
#endif

0 commit comments

Comments
 (0)