00001
00002
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include <stdio.h>
00039 #include <assert.h>
00040 #include <stdbool.h>
00041 #include <stdlib.h>
00042
00043 #include <utils.h>
00044 #include "stack.h"
00045
00046
00048 discover_xml_stack * discover_xml_stack_new()
00049 {
00050 discover_xml_stack *stack;
00051 stack = (discover_xml_stack *) _discover_xmalloc(sizeof(discover_xml_stack));
00052 assert(stack != NULL);
00053
00054 stack->prev = NULL;
00055 stack->data = NULL;
00056 stack->depth = 0;
00057
00058 return stack;
00059 }
00060
00062 void discover_xml_stack_destroy(discover_xml_stack *stack)
00063 {
00064 free(stack);
00065 }
00066
00068 void
00069 discover_xml_stack_push(discover_xml_stack **stack, void *data)
00070 {
00071 discover_xml_stack *new_stack;
00072
00073 new_stack = discover_xml_stack_new();
00074
00075
00076 new_stack->prev = *stack;
00077 new_stack->data = data;
00078 new_stack->depth = (*stack)->depth + 1;
00079 *stack = new_stack;
00080 }
00081
00083 void * discover_xml_stack_pop(discover_xml_stack **stack)
00084 {
00085 void *ctx;
00086 discover_xml_stack *oldstack;
00087
00088 if((*stack)->prev == 0) {
00089 return NULL;
00090 }
00091
00092 oldstack = *stack;
00093 ctx = (*stack)->data;
00094
00095 *stack = (*stack)->prev;
00096 (*stack)->depth = oldstack->depth - 1;
00097 discover_xml_stack_destroy(oldstack);
00098
00099 return ctx;
00100 }
00101
00103 void * discover_xml_stack_get(discover_xml_stack *stack)
00104 {
00105 return stack->data;
00106 }
00107
00109 void * discover_xml_stack_getbynum(discover_xml_stack *stack, int i)
00110 {
00111 discover_xml_stack *S;
00112
00113 S = stack;
00114 while(S->depth < i) {
00115 S = stack->prev;
00116 }
00117 return S->data;
00118 }
00119
00120
00121
00122
00123
00124
00125
00126