Wednesday, 25 July 2018

Simple C to Que by using Doubly-Linked List

/*
 * File name: m_que.h
 * Author: Seree Rakwong
 * Date: 16-SEP-2013
 *
 */

#ifndef _MQUE_H_
#define _MQUE_H_

#include "m_list.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef void* mque_t;

long    mque_init();
void    mque_release();

mque_t  mque_create();
void    mque_destroy(mque_t que);

int     mque_enque(mque_t que, const void *data, size_t size);
size_t  mque_get_que(mque_t que, void *data, size_t size);
int     mque_deque(mque_t que);
int     mque_get_count(mque_t que);
int     mque_is_empty(mque_t que);

#ifdef __cplusplus
}
#endif

#endif /* _MQUE_H_ */

/*
 * File name: m_que.c
 * Author: Seree Rakwong
 * Date: 16-SEP-2013
 *
 */
#include "m_que.h"

#define MQUE_SIGNATURE         0x51554500


#ifdef __cplusplus
extern "C" {
#endif

typedef struct mque_s
{
    mlist_t        list;
    unsigned long  signature;
} mque_s, *mque_sp;

/*
* #################### BOF helper functions ####################
*/
mque_sp mque_verify_que(mque_t que)
{
    mque_sp pque = (mque_sp)que;
    if (!pque || pque->signature != MQUE_SIGNATURE)
        return 0;

    return pque;
}

/*
#################### EOF helper functions ####################
*/
long    mque_init()
{
    return mlist_init();
}

void    mque_release()
{
    mlist_init();
}

mque_t mque_create()
{
    mque_sp pque = (mque_sp)malloc(sizeof(mque_s));
    if (!pque)
        return 0;

    pque->list = mlist_create();
    pque->signature = MQUE_SIGNATURE;

    return (mque_t)pque;
}

void mque_destroy(mque_t que)
{
    mque_sp pque = mque_verify_que(que);
    if (!pque)
        return;

    mlist_destroy(pque->list);
    free(pque);
    pque = 0;
}

int mque_enque(mque_t que, const void *data, size_t size)
{
    mque_sp pque = mque_verify_que(que);
    if (!pque)
        return 1;

    if (0 == mlist_insert_last(pque->list, data, size))
        return -1;
    return 0;
}

size_t mque_get_que(mque_t que, void *data, size_t size)
{
    mque_sp pque = mque_verify_que(que);
    if (!pque)
        return -1;
    return mlist_get_item(mlist_get_begin(pque->list), data, size);
}

int mque_deque(mque_t que)
{
    mque_sp pque = mque_verify_que(que);
    if (!pque)
        return 1;

    return mlist_remove_first(pque->list);
}

int mque_get_count(mque_t que)
{
    mque_sp pque = mque_verify_que(que);
    if (!pque)
        return -1;

    return mlist_get_count(pque->list);
}

int mque_is_empty(mque_t que)
{
    return (mque_get_count(que) == 0);
}

#ifdef __cplusplus
}
#endif

No comments:

Post a Comment