How to make library generic?

This commit is contained in:
2024-02-05 00:45:30 +05:30
parent dee48d5d1b
commit 19e67acd4c
26 changed files with 1547 additions and 0 deletions

Binary file not shown.

Binary file not shown.

BIN
ProgrammableLib/.dll.c.un~ Normal file

Binary file not shown.

BIN
ProgrammableLib/.dll.h.un~ Normal file

Binary file not shown.

14
ProgrammableLib/Makefile Normal file
View File

@@ -0,0 +1,14 @@
TARGET: exe
libdll.a: dll.o
ar rs libdll.a dll.o
dll.o: dll.c
gcc -c -I . dll.c -o dll.o
exe: application.o libdll.a
gcc application.o -o exe -L . -ldll
application.o: application.c
gcc -c -I . application.c -o application.o
clean:
rm *.o
rm libdll.a
rm exe

View File

@@ -0,0 +1,200 @@
/*
* =====================================================================================
*
* Filename: application.c
*
* Description:
*
* Version: 1.0
* Created: 04/02/24 11:38:59 PM IST
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Organization:
*
* =====================================================================================
*/
#include "dll.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
/*Application specific data structures*/
typedef struct student_{
char name[32];
int age;
int weight;
unsigned int rollno;
} student_t;
static void
print_student_details(student_t *student){
printf("Name = %s\n", student->name);
printf("Age = %d\n", student->age);
printf("weight = %d\n", student->weight);
printf("rollno = %u\n", student->rollno);
}
static void
print_student_db(dll_t *student_db) {
if(!student_db || !student_db->head) return;
dll_node_t *head = student_db->head;
student_t *data = NULL;
while(head){
data = head->data;
print_student_details(data);
head = head->right;
}
}
/*Application specific data structures*/
typedef struct employee_{
char name[32];
char designation[32];
unsigned int salary;
unsigned int emp_id;
} employee_t;
static void
print_employee_details(employee_t *employee){
printf("Name = %s\n", employee->name);
printf("Designation = %s\n", employee->designation);
printf("salary = %u\n", employee->salary);
printf("emp_id = %u\n", employee->emp_id);
}
static void
print_employee_db(dll_t *student_db) {
if(!student_db || !student_db->head) return;
dll_node_t *head = student_db->head;
student_t *data = NULL;
while(head){
data = head->data;
print_student_details(data);
head = head->right;
}
}
/*Search function*/
student_t *
search_student_by_rollno(dll_t *student_db,
unsigned int rollno/*search key*/){
if(!student_db || !student_db->head) return NULL;
dll_node_t *head = student_db->head;
student_t *data = NULL;
while(head){
data = head->data;
if(data->rollno == rollno)
return data;
head = head->right;
}
}
/*Search function*/
employee_t *
search_employee_by_emp_id(dll_t *employee_db,
unsigned int emp_id/*search key*/){
if(!employee_db || !employee_db->head) return NULL;
dll_node_t *head = employee_db->head;
employee_t *data = NULL;
while(head){
data = head->data;
if(data->emp_id == emp_id)
return data;
head = head->right;
}
}
int
main(int argc, char **argv){
/*Student database*/
student_t *student1 = calloc(1, sizeof(student_t));
strncpy(student1->name, "Abhishek", strlen("Abhishek"));
student1->age = 31;
student1->weight = 75;
student1->rollno = 800000;
student_t *student2 = calloc(1, sizeof(student_t));
strncpy(student2->name, "Joseph", strlen("Joseph"));
student2->age = 41;
student2->weight = 70;
student2->rollno = 800400;
student_t *student3 = calloc(1, sizeof(student_t));
strncpy(student3->name, "Jack", strlen("Jack"));
student3->age = 29;
student3->weight = 55;
student3->rollno = 800400;
/*Create a new Linked List*/
dll_t *student_db = get_new_dll();
add_data_to_dll(student_db, student1);
add_data_to_dll(student_db, student2);
add_data_to_dll(student_db, student3);
student_t *student = search_student_by_rollno(student_db, 800400);
if(!student){
printf("Student record not found\n");
}
else{
print_student_details(student);
}
/*Employee database*/
employee_t *employee1 = calloc(1, sizeof(employee_t));
strncpy(employee1->name, "Harsh", strlen("Harsh"));
strncpy(employee1->designation, "Vice President", strlen("Vice President"));
employee1->salary = 11131;
employee1->emp_id = 10000;
employee_t *employee2 = calloc(1, sizeof(employee_t));
strncpy(employee2->name, "Huma", strlen("Huma"));
strncpy(employee2->designation, "CEO", strlen("CEO"));
employee1->salary = 127000;
employee1->emp_id = 10001;
employee_t *employee3 = calloc(1, sizeof(employee_t));
strncpy(employee3->name, "Neena", strlen("Neena"));
strncpy(employee2->designation, "Manager", strlen("Manager"));
employee1->salary = 139000;
employee1->emp_id = 10002;
/*Create a new Linked List*/
dll_t *employee_db = get_new_dll();
add_data_to_dll(employee_db, employee1);
add_data_to_dll(employee_db, employee2);
add_data_to_dll(employee_db, employee3);
employee_t *employee = search_employee_by_emp_id(employee_db, 10002);
if(!employee){
printf("Student record not found\n");
}
else{
print_employee_details(employee);
}
return 0;
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,14 @@
TARGET: exe
libdll.a: dll.o
ar rs libdll.a dll.o
dll.o: dll.c
gcc -g -c -I . dll.c -o dll.o
exe: application.o libdll.a
gcc -g application.o -o exe -L . -ldll
application.o: application.c
gcc -g -c -I . application.c -o application.o
clean:
rm *.o
rm libdll.a
rm exe

View File

@@ -0,0 +1,278 @@
/*
* =====================================================================================
*
* Filename: application.c
*
* Description:
*
* Version: 1.0
* Created: 05/02/24 12:25:12 AM IST
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Organization:
*
* =====================================================================================
*/
#include "dll.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <assert.h>
/*Application specific data structures*/
typedef struct student_{
char name[32];
int age;
int weight;
unsigned int rollno;
} student_t;
static void
print_student_details(student_t *student){
printf("Name = %s\n", student->name);
printf("Age = %d\n", student->age);
printf("weight = %d\n", student->weight);
printf("rollno = %u\n", student->rollno);
}
static void
print_student_db(dll_t *student_db) {
if(!student_db || !student_db->head) return;
dll_node_t *head = student_db->head;
student_t *data = NULL;
while(head){
data = head->data;
print_student_details(data);
head = head->right;
}
}
/*Application specific data structures*/
typedef struct employee_{
char name[32];
char designation[32];
unsigned int salary;
unsigned int emp_id;
} employee_t;
static void
print_employee_details(employee_t *employee){
printf("Name = %s\n", employee->name);
printf("Designation = %s\n", employee->designation);
printf("salary = %u\n", employee->salary);
printf("emp_id = %u\n", employee->emp_id);
}
static void
print_employee_db(dll_t *student_db) {
if(!student_db || !student_db->head) return;
dll_node_t *head = student_db->head;
student_t *data = NULL;
while(head){
data = head->data;
print_student_details(data);
head = head->right;
}
}
/*Search function*/
student_t *
search_student_by_rollno(dll_t *student_db,
unsigned int rollno/*search key*/){
if(!student_db || !student_db->head) return NULL;
dll_node_t *head = student_db->head;
student_t *data = NULL;
while(head){
data = head->data;
if(data->rollno == rollno)
return data;
head = head->right;
}
}
/*Search function*/
employee_t *
search_employee_by_emp_id(dll_t *employee_db,
unsigned int emp_id/*search key*/){
if(!employee_db || !employee_db->head) return NULL;
dll_node_t *head = employee_db->head;
employee_t *data = NULL;
while(head){
data = head->data;
if(data->emp_id == emp_id)
return data;
head = head->right;
}
}
/*Search callbacks*/
static int /*return 0 if matches, return -1 if do not match*/
search_student_db_by_key(void *data, void *key){
student_t *student = (student_t *)data;
unsigned int rollno = *((unsigned int*)key);
if(student->rollno == rollno)
return 0;
return -1;
}
/*Search callbacks*/
static int /*return 0 if matches, return -1 if do not match*/
search_employee_db_by_key(void *data, void *key){
employee_t *emp = (employee_t *)data;
unsigned int emp_id = *((unsigned int*)key);
if(emp->emp_id == emp_id)
return 0;
return -1;
}
/*Comparion Callback*/
/*Return 0 if equal,
* -1 if stud1 < stud2
* 1 if stud1 > stud2*/
static int
student_comparison_fn(void *stud1, void *stud2){
/*Let us define the sorting order of students,
* Let us compare the students Alphabetically on their names
* If two students have same name, younger students should
* come before elder student
* If age is also same, lighter student comes before heavier
* if Weight is also same, students with numerically lesser rollno
* comes before in the DLL*/
student_t *student1 = (student_t *)stud1;
student_t *student2 = (student_t *)stud2;
if(strncmp(student1->name, student2->name, 32) < 0)
return -1;
else if(strncmp(student1->name, student2->name, 32) > 0)
return 1;
else if(student1->age < student2->age)
return -1;
else if(student1->age > student2->age)
return 1;
else if(student1->weight < student2->weight)
return -1;
else if(student1->weight > student2->weight)
return 1;
else if(student1->rollno < student2->rollno)
return -1;
else if(student1->rollno > student2->rollno)
return 1;
assert(0); /*intentionally Crash the program !!*/
}
int
main(int argc, char **argv){
/*Student database*/
student_t *student1 = calloc(1, sizeof(student_t));
strncpy(student1->name, "Abhishek", strlen("Abhishek"));
student1->age = 31;
student1->weight = 75;
student1->rollno = 800000;
student_t *student2 = calloc(1, sizeof(student_t));
strncpy(student2->name, "Joseph", strlen("Joseph"));
student2->age = 41;
student2->weight = 70;
student2->rollno = 800400;
student_t *student3 = calloc(1, sizeof(student_t));
strncpy(student3->name, "Jack", strlen("Jack"));
student3->age = 29;
student3->weight = 55;
student3->rollno = 800400;
student_t *student4 = calloc(1, sizeof(student_t));
strncpy(student3->name, "Abhishek", strlen("Abhishek"));
student3->age = 29;
student3->weight = 55;
student3->rollno = 800399;
/*Create a new Linked List*/
dll_t *student_db = get_new_dll();
register_key_match_callback(student_db, search_student_db_by_key);
register_comparison_callback(student_db, student_comparison_fn);
dll_priority_insert_data(student_db, student1);
dll_priority_insert_data(student_db, student2);
dll_priority_insert_data(student_db, student3);
#if 0
//student_t *student = search_student_by_rollno(student_db, 800400);
student_t *student = dll_search_by_key(student_db, (void *)800400);
if(!student){
printf("Student record not found\n");
}
else{
print_student_details(student);
}
#endif
printf("Printing Stduents list\n");
print_student_db(student_db);
#if 0
/*Employee database*/
employee_t *employee1 = calloc(1, sizeof(employee_t));
strncpy(employee1->name, "Harsh", strlen("Harsh"));
strncpy(employee1->designation, "Vice President", strlen("Vice President"));
employee1->salary = 11131;
employee1->emp_id = 10000;
employee_t *employee2 = calloc(1, sizeof(employee_t));
strncpy(employee2->name, "Huma", strlen("Huma"));
strncpy(employee2->designation, "CEO", strlen("CEO"));
employee1->salary = 127000;
employee1->emp_id = 10001;
employee_t *employee3 = calloc(1, sizeof(employee_t));
strncpy(employee3->name, "Neena", strlen("Neena"));
strncpy(employee2->designation, "Manager", strlen("Manager"));
employee1->salary = 139000;
employee1->emp_id = 10002;
/*Create a new Linked List*/
dll_t *employee_db = get_new_dll();
register_key_match_callback(employee_db, search_employee_db_by_key);
register_comparison_callback(employee_db, student_comparison_fn);
add_data_to_dll(employee_db, employee1);
add_data_to_dll(employee_db, employee2);
add_data_to_dll(employee_db, employee3);
employee_t *employee = dll_search_by_key(employee_db, (void *)10002);
if(!employee){
printf("Student record not found\n");
}
else{
print_employee_details(employee);
}
#endif
return 0;
}

View File

@@ -0,0 +1,278 @@
/*
* =====================================================================================
*
* Filename: application.c
*
* Description:
*
* Version: 1.0
* Created: 05/02/24 12:25:12 AM IST
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Organization:
*
* =====================================================================================
*/
#include "dll.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <assert.h>
/*Application specific data structures*/
typedef struct student_{
char name[32];
int age;
int weight;
unsigned int rollno;
} student_t;
static void
print_student_details(student_t *student){
printf("Name = %s\n", student->name);
printf("Age = %d\n", student->age);
printf("weight = %d\n", student->weight);
printf("rollno = %u\n", student->rollno);
}
static void
print_student_db(dll_t *student_db) {
if(!student_db || !student_db->head) return;
dll_node_t *head = student_db->head;
student_t *data = NULL;
while(head){
data = head->data;
print_student_details(data);
head = head->right;
}
}
/*Application specific data structures*/
typedef struct employee_{
char name[32];
char designation[32];
unsigned int salary;
unsigned int emp_id;
} employee_t;
static void
print_employee_details(employee_t *employee){
printf("Name = %s\n", employee->name);
printf("Designation = %s\n", employee->designation);
printf("salary = %u\n", employee->salary);
printf("emp_id = %u\n", employee->emp_id);
}
static void
print_employee_db(dll_t *student_db) {
if(!student_db || !student_db->head) return;
dll_node_t *head = student_db->head;
student_t *data = NULL;
while(head){
data = head->data;
print_student_details(data);
head = head->right;
}
}
/*Search function*/
student_t *
search_student_by_rollno(dll_t *student_db,
unsigned int rollno/*search key*/){
if(!student_db || !student_db->head) return NULL;
dll_node_t *head = student_db->head;
student_t *data = NULL;
while(head){
data = head->data;
if(data->rollno == rollno)
return data;
head = head->right;
}
}
/*Search function*/
employee_t *
search_employee_by_emp_id(dll_t *employee_db,
unsigned int emp_id/*search key*/){
if(!employee_db || !employee_db->head) return NULL;
dll_node_t *head = employee_db->head;
employee_t *data = NULL;
while(head){
data = head->data;
if(data->emp_id == emp_id)
return data;
head = head->right;
}
}
/*Search callbacks*/
static int /*return 0 if matches, return -1 if do not match*/
search_student_db_by_key(void *data, void *key){
student_t *student = (student_t *)data;
unsigned int rollno = (unsigned int)key;
if(student->rollno == rollno)
return 0;
return -1;
}
/*Search callbacks*/
static int /*return 0 if matches, return -1 if do not match*/
search_employee_db_by_key(void *data, void *key){
employee_t *emp = (employee_t *)data;
unsigned int emp_id = (unsigned int)key;
if(emp->emp_id == emp_id)
return 0;
return -1;
}
/*Comparion Callback*/
/*Return 0 if equal,
* -1 if stud1 < stud2
* 1 if stud1 > stud2*/
static int
student_comparison_fn(void *stud1, void *stud2){
/*Let us define the sorting order of students,
* Let us compare the students Alphabetically on their names
* If two students have same name, younger students should
* come before elder student
* If age is also same, lighter student comes before heavier
* if Weight is also same, students with numerically lesser rollno
* comes before in the DLL*/
student_t *student1 = (student_t *)stud1;
student_t *student2 = (student_t *)stud2;
if(strncmp(student1->name, student2->name, 32) < 0)
return -1;
else if(strncmp(student1->name, student2->name, 32) > 0)
return 1;
else if(student1->age < student2->age)
return -1;
else if(student1->age > student2->age)
return 1;
else if(student1->weight < student2->weight)
return -1;
else if(student1->weight > student2->weight)
return 1;
else if(student1->rollno < student2->rollno)
return -1;
else if(student1->rollno > student2->rollno)
return 1;
assert(0); /*intentionally Crash the program !!*/
}
int
main(int argc, char **argv){
/*Student database*/
student_t *student1 = calloc(1, sizeof(student_t));
strncpy(student1->name, "Abhishek", strlen("Abhishek"));
student1->age = 31;
student1->weight = 75;
student1->rollno = 800000;
student_t *student2 = calloc(1, sizeof(student_t));
strncpy(student2->name, "Joseph", strlen("Joseph"));
student2->age = 41;
student2->weight = 70;
student2->rollno = 800400;
student_t *student3 = calloc(1, sizeof(student_t));
strncpy(student3->name, "Jack", strlen("Jack"));
student3->age = 29;
student3->weight = 55;
student3->rollno = 800400;
student_t *student4 = calloc(1, sizeof(student_t));
strncpy(student3->name, "Abhishek", strlen("Abhishek"));
student3->age = 29;
student3->weight = 55;
student3->rollno = 800399;
/*Create a new Linked List*/
dll_t *student_db = get_new_dll();
register_key_match_callback(student_db, search_student_db_by_key);
register_comparison_callback(student_db, student_comparison_fn);
dll_priority_insert_data(student_db, student1);
dll_priority_insert_data(student_db, student2);
dll_priority_insert_data(student_db, student3);
#if 0
//student_t *student = search_student_by_rollno(student_db, 800400);
student_t *student = dll_search_by_key(student_db, (void *)800400);
if(!student){
printf("Student record not found\n");
}
else{
print_student_details(student);
}
#endif
printf("Printing Stduents list\n");
print_student_db(student_db);
#if 0
/*Employee database*/
employee_t *employee1 = calloc(1, sizeof(employee_t));
strncpy(employee1->name, "Harsh", strlen("Harsh"));
strncpy(employee1->designation, "Vice President", strlen("Vice President"));
employee1->salary = 11131;
employee1->emp_id = 10000;
employee_t *employee2 = calloc(1, sizeof(employee_t));
strncpy(employee2->name, "Huma", strlen("Huma"));
strncpy(employee2->designation, "CEO", strlen("CEO"));
employee1->salary = 127000;
employee1->emp_id = 10001;
employee_t *employee3 = calloc(1, sizeof(employee_t));
strncpy(employee3->name, "Neena", strlen("Neena"));
strncpy(employee2->designation, "Manager", strlen("Manager"));
employee1->salary = 139000;
employee1->emp_id = 10002;
/*Create a new Linked List*/
dll_t *employee_db = get_new_dll();
register_key_match_callback(employee_db, search_employee_db_by_key);
register_comparison_callback(employee_db, student_comparison_fn);
add_data_to_dll(employee_db, employee1);
add_data_to_dll(employee_db, employee2);
add_data_to_dll(employee_db, employee3);
employee_t *employee = dll_search_by_key(employee_db, (void *)10002);
if(!employee){
printf("Student record not found\n");
}
else{
print_employee_details(employee);
}
#endif
return 0;
}

View File

@@ -0,0 +1,155 @@
/*
* =====================================================================================
*
* Filename: dll.c
*
* Description:
*
* Version: 1.0
* Created: 05/02/24 12:26:05 AM IST
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Organization:
*
* =====================================================================================
*/
#include "dll.h"
#include <memory.h>
#include <stdlib.h>
/* Public Function Implementation to create and return
* new empty doubly linked list*/
dll_t *
get_new_dll(){
dll_t *dll = calloc(1, sizeof(dll_t));
dll->head = NULL;
dll->key_match = NULL;
return dll;
}
void
register_key_match_callback(dll_t *dll,
int (*key_match)(void *, void *)){
dll->key_match = key_match;
}
void
register_comparison_callback(dll_t *dll,
int (*comparison_cb)(void *, void *)){
dll->comparison_fn = comparison_cb;
}
/*Generic Search function*/
void *
dll_search_by_key (dll_t *dll, void *key){
if(!dll || !dll->head) return NULL;
dll_node_t *head = dll->head;
while(head){
if(dll->key_match(head->data, key) == 0)
return (void *)head->data;
head = head->right;
}
return NULL;
}
/*Return 0 - on success
* -1 on Failure*/
int
dll_priority_insert_data (dll_t *dll, void *data){
if(!dll)
return -1;
/*if DLL is empty*/
if(!dll->head){
add_data_to_dll(dll, data);
return 0;
}
dll_node_t *data_node = calloc(1, sizeof(dll_node_t));
data_node->data = data;
data_node->left = NULL;
data_node->right = NULL;
/* if there is only one node in DLL*/
if(dll->head && !dll->head->right){
if(dll->comparison_fn(dll->head->data, data) == -1){
dll->head->right = data_node;
data_node->left = dll->head;
}
else{
dll->head->left = data_node;
data_node->right = dll->head;
dll->head = data_node;
}
return 0;
}
/*if More than one node in DLL*/
if(dll->comparison_fn(data, dll->head->data) == -1){
data_node->right = dll->head;
dll->head->left = data_node;
dll->head = data_node;
return 0;
}
dll_node_t *prev = NULL,
*curr = NULL;
curr = dll->head;
while(curr){
if(dll->comparison_fn(data, curr->data) != -1){
prev = curr;
curr = curr->right;
continue;
}
prev->right = data_node;
data_node->left = prev;
data_node->right = curr;
curr->left = data_node;
return 0;
}
/*Add in the end*/
prev->right = data_node;
data_node->left = prev;
return 0;
}
/* Public Function Implementation to add a new application
* * data to DLL */
int
add_data_to_dll (dll_t *dll, void *app_data){
if(!dll || !app_data) return -1;
dll_node_t *dll_new_node = calloc(1, sizeof(dll_node_t));
dll_new_node->left = NULL;
dll_new_node->right = NULL;
dll_new_node->data = app_data;
/*Now add this to the front of DLL*/
if(!dll->head){
dll->head = dll_new_node;
return 0;
}
dll_node_t *first_node = dll->head;
dll_new_node->right = first_node;
first_node->left = dll_new_node;
dll->head = dll_new_node;
return 0;
}

View File

@@ -0,0 +1,55 @@
/*
* =====================================================================================
*
* Filename: dll.h
*
* Description:
*
* Version: 1.0
* Created: 05/02/24 12:25:44 AM IST
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Organization:
*
* =====================================================================================
*/
/*Header file for Doubly Linked List*/
typedef struct dll_node_{
void *data;
struct dll_node_ *left;
struct dll_node_ *right;
} dll_node_t;
typedef struct dll_{
dll_node_t *head;
int (*key_match)(void *, void *);
int (*comparison_fn)(void *, void *);
} dll_t;
void
register_key_match_callback(dll_t *dll, int (*key_match)(void *, void *));
void
register_comparison_callback(dll_t *dll, int (*comparison_cb)(void *, void *));
/*Generic Search function*/
void *
dll_search_by_key (dll_t *dll, void *key);
int
dll_priority_insert_data (dll_t *dll, void *data);
/* Public Function declaration to create and return
* a new empty doubly linked list*/
dll_t *
get_new_dll();
/* Public Function declaration to add the appication
* data to DLL*/
int
add_data_to_dll(dll_t *dll, void *appn_data);

58
ProgrammableLib/dll.c Normal file
View File

@@ -0,0 +1,58 @@
/*
* =====================================================================================
*
* Filename: dll.c
*
* Description:
*
* Version: 1.0
* Created: 05/02/24 12:08:12 AM IST
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Organization:
*
* =====================================================================================
*/
#include "dll.h"
#include <memory.h>
#include <stdlib.h>
/* Public Function Implementation to create and return
* new empty doubly linked list*/
dll_t *
get_new_dll(){
dll_t *dll = calloc(1, sizeof(dll_t));
dll->head = NULL;
return dll;
}
/* Public Function Implementation to add a new application
* * data to DLL */
int
add_data_to_dll (dll_t *dll, void *app_data){
if(!dll || !app_data) return -1;
dll_node_t *dll_new_node = calloc(1, sizeof(dll_node_t));
dll_new_node->left = NULL;
dll_new_node->right = NULL;
dll_new_node->data = app_data;
/*Now add this to the front of DLL*/
if(!dll->head){
dll->head = dll_new_node;
return 0;
}
dll_node_t *first_node = dll->head;
dll_new_node->right = first_node;
first_node->left = dll_new_node;
dll->head = dll_new_node;
return 0;
}

41
ProgrammableLib/dll.h Normal file
View File

@@ -0,0 +1,41 @@
/*
* =====================================================================================
*
* Filename: dll.h
*
* Description:
*
* Version: 1.0
* Created: 05/02/24 12:08:34 AM IST
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Organization:
*
* =====================================================================================
*/
/*Header file for Doubly Linked List*/
typedef struct dll_node_{
void *data;
struct dll_node_ *left;
struct dll_node_ *right;
} dll_node_t;
typedef struct dll_{
dll_node_t *head;
} dll_t;
/* Public Function declaration to create and return
* a new empty doubly linked list*/
dll_t *
get_new_dll();
/* Public Function declaration to add the appication
* data to DLL*/
int
add_data_to_dll(dll_t *dll, void *appn_data);

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,14 @@
TARGET: exe
libdll.a: dll.o
ar rs libdll.a dll.o
dll.o: dll.c
gcc -g -c -I . dll.c -o dll.o
exe: application.o libdll.a
gcc -g application.o -o exe -L . -ldll
application.o: application.c
gcc -g -c -I . application.c -o application.o
clean:
rm *.o
rm libdll.a
rm exe

View File

@@ -0,0 +1,228 @@
/*
* =====================================================================================
*
* Filename: application.c
*
* Description:
*
* Version: 1.0
* Created: 05/02/24 12:09:48 AM IST
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Organization:
*
* =====================================================================================
*/
#include "dll.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
/*Application specific data structures*/
typedef struct student_{
char name[32];
int age;
int weight;
unsigned int rollno;
} student_t;
static void
print_student_details(student_t *student){
printf("Name = %s\n", student->name);
printf("Age = %d\n", student->age);
printf("weight = %d\n", student->weight);
printf("rollno = %u\n", student->rollno);
}
static void
print_student_db(dll_t *student_db) {
if(!student_db || !student_db->head) return;
dll_node_t *head = student_db->head;
student_t *data = NULL;
while(head){
data = head->data;
print_student_details(data);
head = head->right;
}
}
/*Application specific data structures*/
typedef struct employee_{
char name[32];
char designation[32];
unsigned int salary;
unsigned int emp_id;
} employee_t;
static void
print_employee_details(employee_t *employee){
printf("Name = %s\n", employee->name);
printf("Designation = %s\n", employee->designation);
printf("salary = %u\n", employee->salary);
printf("emp_id = %u\n", employee->emp_id);
}
static void
print_employee_db(dll_t *student_db) {
if(!student_db || !student_db->head) return;
dll_node_t *head = student_db->head;
student_t *data = NULL;
while(head){
data = head->data;
print_student_details(data);
head = head->right;
}
}
/*Search function*/
student_t *
search_student_by_rollno(dll_t *student_db,
unsigned int rollno/*search key*/){
if(!student_db || !student_db->head) return NULL;
dll_node_t *head = student_db->head;
student_t *data = NULL;
while(head){
data = head->data;
if(data->rollno == rollno)
return data;
head = head->right;
}
}
/*Search function*/
employee_t *
search_employee_by_emp_id(dll_t *employee_db,
unsigned int emp_id/*search key*/){
if(!employee_db || !employee_db->head) return NULL;
dll_node_t *head = employee_db->head;
employee_t *data = NULL;
while(head){
data = head->data;
if(data->emp_id == emp_id)
return data;
head = head->right;
}
}
/*Search callbacks*/
static int /*return 0 if matches, return -1 if do not match*/
search_student_db_by_key(void *data, void *key){
student_t *student = (student_t *)data;
unsigned int rollno = (unsigned int)key;
if(student->rollno == rollno)
return 0;
return -1;
}
/*Search callbacks*/
static int /*return 0 if matches, return -1 if do not match*/
search_employee_db_by_key(void *data, void *key){
employee_t *emp = (employee_t *)data;
unsigned int emp_id = (unsigned int)key;
if(emp->emp_id == emp_id)
return 0;
return -1;
}
int
main(int argc, char **argv){
/*Student database*/
student_t *student1 = calloc(1, sizeof(student_t));
strncpy(student1->name, "Abhishek", strlen("Abhishek"));
student1->age = 31;
student1->weight = 75;
student1->rollno = 800000;
student_t *student2 = calloc(1, sizeof(student_t));
strncpy(student2->name, "Joseph", strlen("Joseph"));
student2->age = 41;
student2->weight = 70;
student2->rollno = 800400;
student_t *student3 = calloc(1, sizeof(student_t));
strncpy(student3->name, "Jack", strlen("Jack"));
student3->age = 29;
student3->weight = 55;
student3->rollno = 800400;
/*Create a new Linked List*/
dll_t *student_db = get_new_dll();
register_key_match_callback(student_db, search_student_db_by_key);
add_data_to_dll(student_db, student1);
add_data_to_dll(student_db, student2);
add_data_to_dll(student_db, student3);
//student_t *student = search_student_by_rollno(student_db, 800400);
student_t *student = dll_search_by_key(student_db, (void *)800400);
if(!student){
printf("Student record not found\n");
}
else{
print_student_details(student);
}
/*Employee database*/
employee_t *employee1 = calloc(1, sizeof(employee_t));
strncpy(employee1->name, "Harsh", strlen("Harsh"));
strncpy(employee1->designation, "Vice President", strlen("Vice President"));
employee1->salary = 11131;
employee1->emp_id = 10000;
employee_t *employee2 = calloc(1, sizeof(employee_t));
strncpy(employee2->name, "Huma", strlen("Huma"));
strncpy(employee2->designation, "CEO", strlen("CEO"));
employee1->salary = 127000;
employee1->emp_id = 10001;
employee_t *employee3 = calloc(1, sizeof(employee_t));
strncpy(employee3->name, "Neena", strlen("Neena"));
strncpy(employee2->designation, "Manager", strlen("Manager"));
employee1->salary = 139000;
employee1->emp_id = 10002;
/*Create a new Linked List*/
dll_t *employee_db = get_new_dll();
register_key_match_callback(employee_db, search_employee_db_by_key);
add_data_to_dll(employee_db, employee1);
add_data_to_dll(employee_db, employee2);
add_data_to_dll(employee_db, employee3);
//employee_t *employee = search_employee_by_emp_id(employee_db, 10002);
employee_t *employee = dll_search_by_key(employee_db, (void *)10002);
if(!employee){
printf("Student record not found\n");
}
else{
print_employee_details(employee);
}
return 0;
}

View File

@@ -0,0 +1,82 @@
/*
* =====================================================================================
*
* Filename: dll.c
*
* Description:
*
* Version: 1.0
* Created: 05/02/24 12:10:09 AM IST
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Organization:
*
* =====================================================================================
*/
#include "dll.h"
#include <memory.h>
#include <stdlib.h>
/* Public Function Implementation to create and return
* new empty doubly linked list*/
dll_t *
get_new_dll(){
dll_t *dll = calloc(1, sizeof(dll_t));
dll->head = NULL;
dll->key_match = NULL;
return dll;
}
void
register_key_match_callback(dll_t *dll,
int (*key_match)(void *, void *)){
dll->key_match = key_match;
}
/*Generic Search function*/
void *
dll_search_by_key (dll_t *dll, void *key){
if(!dll || !dll->head) return NULL;
dll_node_t *head = dll->head;
while(head){
if(dll->key_match(head->data, key) == 0)
return (void *)head->data;
head = head->right;
}
return NULL;
}
/* Public Function Implementation to add a new application
* * data to DLL */
int
add_data_to_dll (dll_t *dll, void *app_data){
if(!dll || !app_data) return -1;
dll_node_t *dll_new_node = calloc(1, sizeof(dll_node_t));
dll_new_node->left = NULL;
dll_new_node->right = NULL;
dll_new_node->data = app_data;
/*Now add this to the front of DLL*/
if(!dll->head){
dll->head = dll_new_node;
return 0;
}
dll_node_t *first_node = dll->head;
dll_new_node->right = first_node;
first_node->left = dll_new_node;
dll->head = dll_new_node;
return 0;
}

View File

@@ -0,0 +1,82 @@
/*
* =====================================================================================
*
* Filename: dll.c
*
* Description:
*
* Version: 1.0
* Created: 05/02/24 12:10:09 AM IST
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Organization:
*
* =====================================================================================
*/
#include "dll.h"
#include <memory.h>
#include <stdlib.h>
/* Public Function Implementation to create and return
* new empty doubly linked list*/
dll_t *
get_new_dll(){
dll_t *dll = calloc(1, sizeof(dll_t));
dll->head = NULL;
dll->key_match = NULL;
return dll;
}
void
register_key_match_callback(dll_t *dll,
int (*key_match)(void *, void *)){
dll->key_match = key_match;
}
/*Generic Search function*/
void *
dll_search_by_key (dll_t *dll, void *key){
if(!dll || !dll->head) return NULL;
dll_node_t *head = dll->head;
while(head){
if(dll->key_match(head->data, key) == 0)
return (void *)head->data;
head = head->right;
}
return NULL;
}
/* Public Function Implementation to add a new application
* * data to DLL */
int
add_data_to_dll (dll_t *dll, void *app_data){
if(!dll || !app_data) return -1;
dll_node_t *dll_new_node = calloc(1, sizeof(dll_node_t));
dll_new_node->left = NULL;
dll_new_node->right = NULL;
dll_new_node->data = app_data;
/*Now add this to the front of DLL*/
if(!dll->head){
dll->head = dll_new_node;
return 0;
}
dll_node_t *first_node = dll->head;
dll_new_node->right = first_node;
first_node->left = dll_new_node;
dll->head = dll_new_node;
return 0;
}

View File

@@ -0,0 +1,48 @@
/*
* =====================================================================================
*
* Filename: dll.h
*
* Description:
*
* Version: 1.0
* Created: 05/02/24 12:10:31 AM IST
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Organization:
*
* =====================================================================================
*/
/*Header file for Doubly Linked List*/
typedef struct dll_node_{
void *data;
struct dll_node_ *left;
struct dll_node_ *right;
} dll_node_t;
typedef struct dll_{
dll_node_t *head;
int (*key_match)(void *, void *);
} dll_t;
void
register_key_match_callback(dll_t *dll, int (*key_match)(void *, void *));
/*Generic Search function*/
void *
dll_search_by_key (dll_t *dll, void *key);
/* Public Function declaration to create and return
* a new empty doubly linked list*/
dll_t *
get_new_dll();
/* Public Function declaration to add the appication
* data to DLL*/
int
add_data_to_dll(dll_t *dll, void *appn_data);