diff options
author | Dmitri Pal <dpal@redhat.com> | 2009-07-01 18:22:19 -0400 |
---|---|---|
committer | Stephen Gallagher <sgallagh@redhat.com> | 2009-07-02 08:16:35 -0400 |
commit | 9a28c36d323c14e31a3895ffe7dc905b815291f8 (patch) | |
tree | 9f43b63b340092f9e63d7e403a36a22f51643124 /common/collection/collection_stack.c | |
parent | 203d8d4ffb03897ab995bc2a6311f2a603245269 (diff) | |
download | sssd2-9a28c36d323c14e31a3895ffe7dc905b815291f8.tar.gz sssd2-9a28c36d323c14e31a3895ffe7dc905b815291f8.tar.xz sssd2-9a28c36d323c14e31a3895ffe7dc905b815291f8.zip |
Queue and stack APIs using collection.
Patch adds two interfaces for stack and queue using
collection as underlaying implementation.
It also fixes a bug in the insterion code -
the unsigned properties were created as long.
Diffstat (limited to 'common/collection/collection_stack.c')
-rw-r--r-- | common/collection/collection_stack.c | 350 |
1 files changed, 350 insertions, 0 deletions
diff --git a/common/collection/collection_stack.c b/common/collection/collection_stack.c new file mode 100644 index 00000000..347d9b6c --- /dev/null +++ b/common/collection/collection_stack.c @@ -0,0 +1,350 @@ +/* + STACK + + Implementation of the stack on top of collection library interface. + + Copyright (C) Dmitri Pal <dpal@redhat.com> 2009 + + Collection Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Collection Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with Collection Library. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "stdlib.h" +#include "errno.h" +#include "collection_stack.h" +#include "trace.h" + +/* Function that creates a stack object */ +int create_stack(struct collection_item **stack) +{ + int error = EOK; + + TRACE_FLOW_STRING("create_stack", "Entry point."); + + error = create_collection(stack, COL_NAME_STACK, COL_CLASS_STACK); + + TRACE_FLOW_STRING("create_stack", "Exit."); + return error; +} + +/* Function that destroys a stack object */ +void destroy_stack(struct collection_item *stack) +{ + TRACE_FLOW_STRING("destroy_stack", "Entry point."); + + destroy_collection(stack); + + TRACE_FLOW_STRING("destroy_stack", "Exit"); +} + + + +int push_str_property(struct collection_item *stack, + const char *property, char *string, int length) +{ + int error = EOK; + + TRACE_FLOW_STRING("push_str_property", "Entry point."); + + /* Check that stack is not empty */ + if (stack == NULL) { + TRACE_ERROR_STRING("Stack can't be NULL", ""); + return EINVAL; + } + + /* Make sure it is a stack */ + if (!is_of_class(stack, COL_CLASS_STACK)) { + TRACE_ERROR_STRING("Wrong class", ""); + return EINVAL; + } + + error = add_str_property(stack, NULL, property, string, length); + + TRACE_FLOW_STRING("push_str_property", "Exit."); + return error; +} + +/* Push a binary property to stack. */ +int push_binary_property(struct collection_item *stack, + const char *property, void *binary_data, int length) +{ + int error = EOK; + + TRACE_FLOW_STRING("push_binary_property", "Entry point."); + + /* Check that stack is not empty */ + if (stack == NULL) { + TRACE_ERROR_STRING("Stack can't be NULL", ""); + return EINVAL; + } + + /* Make sure it is a stack */ + if (!is_of_class(stack, COL_CLASS_STACK)) { + TRACE_ERROR_STRING("Wrong class", ""); + return EINVAL; + } + + error = add_binary_property(stack, NULL, property, binary_data, length) + + TRACE_FLOW_STRING("push_binary_property", "Exit."); + return error; +} + + +/* Push an int property to stack. */ +int push_int_property(struct collection_item *stack, + const char *property, int number) +{ + int error = EOK; + + TRACE_FLOW_STRING("push_int_property", "Entry point."); + + /* Check that stack is not empty */ + if (stack == NULL) { + TRACE_ERROR_STRING("Stack can't be NULL", ""); + return EINVAL; + } + + /* Make sure it is a stack */ + if (!is_of_class(stack, COL_CLASS_STACK)) { + TRACE_ERROR_STRING("Wrong class", ""); + return EINVAL; + } + + error = add_int_property(stack, NULL, property, number); + + TRACE_FLOW_STRING("push_int_property", "Exit."); + return error; +} + +/* Push an unsigned int property to stack. */ +int push_unsigned_property(struct collection_item *stack, + const char *property, unsigned int number) +{ + int error = EOK; + + TRACE_FLOW_STRING("push_unsigned_property", "Entry point."); + + /* Check that stack is not empty */ + if (stack == NULL) { + TRACE_ERROR_STRING("Stack can't be NULL", ""); + return EINVAL; + } + + /* Make sure it is a stack */ + if (!is_of_class(stack, COL_CLASS_STACK)) { + TRACE_ERROR_STRING("Wrong class", ""); + return EINVAL; + } + + error = add_unsigned_property(stack, NULL, property, number); + + TRACE_FLOW_STRING("push_unsigned_property", "Exit."); + return error; +} + + +/* Push a long property. */ +int push_long_property(struct collection_item *stack, + const char *property, long number) +{ + int error = EOK; + + TRACE_FLOW_STRING("push_long_property", "Entry point."); + + /* Check that stack is not empty */ + if (stack == NULL) { + TRACE_ERROR_STRING("Stack can't be NULL", ""); + return EINVAL; + } + + /* Make sure it is a stack */ + if (!is_of_class(stack, COL_CLASS_STACK)) { + TRACE_ERROR_STRING("Wrong class", ""); + return EINVAL; + } + + error = add_long_property(stack, NULL, property, number); + + TRACE_FLOW_STRING("push_long_property", "Exit."); + return error; +} + +/* Push an unsigned long property. */ +int push_ulong_property(struct collection_item *stack, + const char *property, unsigned long number) +{ + int error = EOK; + + TRACE_FLOW_STRING("push_ulong_property", "Entry point."); + + /* Check that stack is not empty */ + if (stack == NULL) { + TRACE_ERROR_STRING("Stack can't be NULL", ""); + return EINVAL; + } + + /* Make sure it is a stack */ + if (!is_of_class(stack, COL_CLASS_STACK)) { + TRACE_ERROR_STRING("Wrong class", ""); + return EINVAL; + } + + error = add_ulong_property(stack, NULL, property, number); + + TRACE_FLOW_STRING("push_ulong_property", "Exit."); + return error; +} + +/* Push a double property. */ +int push_double_property(struct collection_item *stack, + const char *property, double number) +{ + int error = EOK; + + TRACE_FLOW_STRING("push_double_property", "Entry point."); + + /* Check that stack is not empty */ + if (stack == NULL) { + TRACE_ERROR_STRING("Stack can't be NULL", ""); + return EINVAL; + } + + /* Make sure it is a stack */ + if (!is_of_class(stack, COL_CLASS_STACK)) { + TRACE_ERROR_STRING("Wrong class", ""); + return EINVAL; + } + + error = add_double_property(stack, NULL, property, number); + + TRACE_FLOW_STRING("push_double_property", "Exit."); + return error; +} + +/* Push a bool property. */ +int push_bool_property(struct collection_item *stack, + const char *property, unsigned char logical) +{ + int error = EOK; + + TRACE_FLOW_STRING("push_bool_property", "Entry point."); + + /* Check that stack is not empty */ + if (stack == NULL) { + TRACE_ERROR_STRING("Stack can't be NULL", ""); + return EINVAL; + } + + /* Make sure it is a stack */ + if (!is_of_class(stack, COL_CLASS_STACK)) { + TRACE_ERROR_STRING("Wrong class", ""); + return EINVAL; + } + + error = add_bool_property(stack, NULL, property, logical); + + TRACE_FLOW_STRING("push_double_property", "Exit."); + return error; +} + +/* Push any property */ +int push_any_property(struct collection_item *stack, + const char *property, + int type, + void *data, + int length) +{ + int error = EOK; + + TRACE_FLOW_STRING("push_bool_property", "Entry point."); + + /* Check that stack is not empty */ + if (stack == NULL) { + TRACE_ERROR_STRING("Stack can't be NULL", ""); + return EINVAL; + } + + /* Make sure it is a stack */ + if (!is_of_class(stack, COL_CLASS_STACK)) { + TRACE_ERROR_STRING("Wrong class", ""); + return EINVAL; + } + + error = add_any_property(stack, NULL, property, type, data, length); + + TRACE_FLOW_STRING("push_bool_property", "Exit."); + return error; +} + +/* Push item */ +int push_item(struct collection_item *stack, + struct collection_item *item) +{ + int error = EOK; + + TRACE_FLOW_STRING("push_item", "Entry point."); + + /* Check that stack is not empty */ + if (stack == NULL) { + TRACE_ERROR_STRING("Stack can't be NULL", ""); + return EINVAL; + } + + /* Make sure it is a stack */ + if (!is_of_class(stack, COL_CLASS_STACK)) { + TRACE_ERROR_STRING("Wrong class", ""); + return EINVAL; + } + + error = insert_item_into_current(stack, + item, + COL_DSP_END, + NULL, + 0, + COL_INSERT_NOCHECK); + + TRACE_FLOW_STRING("push_item", "Exit."); + return error; +} + +/* Pop_item */ +int pop_item(struct collection_item *stack, + struct collection_item **item) +{ + int error = EOK; + + TRACE_FLOW_STRING("pop_item", "Entry point."); + + /* Check that stack is not empty */ + if (stack == NULL) { + TRACE_ERROR_STRING("Stack can't be NULL", ""); + return EINVAL; + } + + /* Make sure it is a stack */ + if (!is_of_class(stack, COL_CLASS_STACK)) { + TRACE_ERROR_STRING("Wrong class", ""); + return EINVAL; + } + + error = extract_item_from_current(stack, + COL_DSP_END, + NULL, + 0, + 0, + item); + + TRACE_FLOW_STRING("pop_item", "Exit."); + return error; +} |