lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAFf+5zhr96ORRJO_AMn3ZVc-REdkYAjxegq-3p=LSnGybgpG6g@mail.gmail.com>
Date:   Thu, 20 Oct 2022 12:09:47 +0530
From:   Amit <amitchoudhary0523@...il.com>
To:     linux-kernel@...r.kernel.org
Subject: Generic Linked List Library (like C++ STL list) - version 1.0

Generic Linked List Library (like C++ STL list) - version 1.0

The code is below:

-------------------------------------
generic_linked_list_library.c
-------------------------------------

/*
 * License: This file has been released under APACHE LICENSE, VERSION 2.0.
 * The license details can be found here:
https://www.apache.org/licenses/LICENSE-2.0
 */

#include <stdlib.h>
#include <string.h>

#include "generic_linked_list_library.h"

struct generic_linked_list_container
*init_generic_linked_list_container(before_deleting_data_callback_function
func)
{

    struct generic_linked_list_container *gllc_ptr = malloc(sizeof(*gllc_ptr));

    if (!gllc_ptr)
        return NULL;

    gllc_ptr->first = NULL;
    gllc_ptr->last = NULL;
    gllc_ptr->bdd_callback_func = func;
    gllc_ptr->total_number_of_nodes = 0;

    return gllc_ptr;

} // end of init_generic_linked_list_container

int add_new_node_to_end(struct generic_linked_list_container
*gllc_ptr, void *data, long data_len)
{

    struct linked_list_node *lln = NULL;
    struct node_data *nddt = NULL;

    if (!data)
        return ARG_DATA_IS_NULL;

    if (data_len <= 0)
        return DATA_LEN_IS_INVALID;

    lln = malloc(sizeof(*lln));
    if (!lln) {
        return NO_MEMORY;
    }

    nddt = malloc(sizeof(*nddt));
    if (!nddt) {
        free(lln);
        return NO_MEMORY;
    }

    nddt->data = malloc((size_t)(data_len));
    if (!nddt->data) {
        free(nddt);
        free(lln);
        return NO_MEMORY;
    }

    nddt->data_len = data_len;
    memmove(nddt->data, data, (size_t)(nddt->data_len));

    lln->nd_ptr = nddt;
    lln->next = NULL;

    if (gllc_ptr->total_number_of_nodes == 0) {
        gllc_ptr->first = lln;
        gllc_ptr->last = lln;
    } else {
        gllc_ptr->last->next = lln;
    }

    gllc_ptr->total_number_of_nodes = gllc_ptr->total_number_of_nodes + 1;

    return GLLL_SUCCESS;

} // end of add_new_node_to_end

struct node_data *remove_front_node_and_get_data(struct
generic_linked_list_container *gllc_ptr)
{

    struct linked_list_node *lln_ptr = NULL;
    struct node_data *nddt = NULL;

    lln_ptr = remove_front_node(gllc_ptr);
    if (!lln_ptr)
        return NULL;

    nddt = lln_ptr->nd_ptr;

    free(lln_ptr);

    return nddt;

} // end of remove_front_node_and_get_data

struct linked_list_node *remove_front_node(struct
generic_linked_list_container *gllc_ptr)
{

    struct linked_list_node *lln_ptr = NULL;

    if (gllc_ptr->total_number_of_nodes == 0)
        return NULL;

    lln_ptr = gllc_ptr->first;

    if (gllc_ptr->total_number_of_nodes == 1) {
        gllc_ptr->first = NULL;
        gllc_ptr->last = NULL;
    } else {
        gllc_ptr->first = gllc_ptr->first->next;
    }

    gllc_ptr->total_number_of_nodes = gllc_ptr->total_number_of_nodes - 1;

    lln_ptr->next = NULL;

    return lln_ptr;

} // end of remove_front_node

void delete_front_node(struct generic_linked_list_container *gllc_ptr)
{

    struct linked_list_node *lln_ptr = NULL;
    struct node_data *nddt = NULL;

    lln_ptr = remove_front_node(gllc_ptr);
    if (!lln_ptr)
        return;

    nddt = lln_ptr->nd_ptr;

    if (gllc_ptr->bdd_callback_func)
        gllc_ptr->bdd_callback_func(nddt);

    free(nddt);
    free(lln_ptr);

    return;

} // end of delete_front_node

-------------------------------------
generic_linked_list_library.h
-------------------------------------

/*
 * License: This file has been released under APACHE LICENSE, VERSION 2.0.
 * The license details can be found here:
https://www.apache.org/licenses/LICENSE-2.0
 */

#ifndef _GENERIC_LINKED_LIST_LIBRARY_H_
#define _GENERIC_LINKED_LIST_LIBRARY_H_

#define GLLL_SUCCESS 0 // everything happened successfully
#define ARG_DATA_IS_NULL -1 // 'data' argument is NULL
#define DATA_LEN_IS_INVALID -2 // 'data_len' argument is <= 0
#define NO_MEMORY -3 // no memory available

struct node_data
{
    void *data;
    long data_len;
};

struct linked_list_node
{
    struct node_data *nd_ptr;
    struct linked_list_node *next;
};

typedef void (*before_deleting_data_callback_function)(struct node_data *);

struct generic_linked_list_container
{
    struct linked_list_node *first;
    struct linked_list_node *last;
    before_deleting_data_callback_function bdd_callback_func;
    long total_number_of_nodes;
};

struct generic_linked_list_container
*init_generic_linked_list_container(before_deleting_data_callback_function
func);
int add_new_node_to_end(struct generic_linked_list_container
*gllc_ptr, void *data, long data_len);
struct node_data *remove_front_node_and_get_data(struct
generic_linked_list_container *gllc_ptr);
struct linked_list_node *remove_front_node(struct
generic_linked_list_container *gllc_ptr);
void delete_front_node(struct generic_linked_list_container *gllc_ptr);

#endif

---- End of code ----

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ