/src/sleuthkit/tsk/base/tsk_stack.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * The Sleuth Kit |
3 | | * |
4 | | * Brian Carrier [carrier <at> sleuthkit [dot] org] |
5 | | * Copyright (c) 2007-2011 Brian Carrier. All Rights reserved |
6 | | * |
7 | | * This software is distributed under the Common Public License 1.0 |
8 | | */ |
9 | | #include "tsk_base_i.h" |
10 | | |
11 | | /** \file tsk_stack.c |
12 | | * Contains the functions to create and maintain a stack, which supports basic |
13 | | * popping, pushing, and searching. These are used for finding loops when |
14 | | * recursing structures */ |
15 | | |
16 | | |
17 | | /** |
18 | | * \ingroup baselib |
19 | | * Create a TSK_STACK structure |
20 | | * @returns Pointer to structure or NULL on error |
21 | | */ |
22 | | TSK_STACK * |
23 | | tsk_stack_create() |
24 | 4.99k | { |
25 | 4.99k | TSK_STACK *tsk_stack; |
26 | 4.99k | if ((tsk_stack = (TSK_STACK *) tsk_malloc(sizeof(TSK_STACK))) == NULL) { |
27 | 0 | return NULL; |
28 | 0 | } |
29 | | |
30 | 4.99k | tsk_stack->len = 64; |
31 | 4.99k | tsk_stack->top = 0; |
32 | 4.99k | if ((tsk_stack->vals = |
33 | 4.99k | (uint64_t *) tsk_malloc(tsk_stack->len * sizeof(uint64_t))) == |
34 | 4.99k | NULL) { |
35 | 0 | free(tsk_stack); |
36 | 0 | return NULL; |
37 | 0 | } |
38 | 4.99k | return tsk_stack; |
39 | 4.99k | } |
40 | | |
41 | | /** |
42 | | * \ingroup baselib |
43 | | * Push a value to the top of TSK_STACK. |
44 | | * @param a_tsk_stack Pointer to stack to push onto |
45 | | * @param a_val Value to push on |
46 | | * @returns 1 on error |
47 | | */ |
48 | | uint8_t |
49 | | tsk_stack_push(TSK_STACK * a_tsk_stack, uint64_t a_val) |
50 | 609 | { |
51 | 609 | if (a_tsk_stack->top == a_tsk_stack->len) { |
52 | 0 | a_tsk_stack->len += 64; |
53 | 0 | if ((a_tsk_stack->vals = |
54 | 0 | (uint64_t *) tsk_realloc((char *) a_tsk_stack->vals, |
55 | 0 | a_tsk_stack->len * sizeof(uint64_t))) == NULL) { |
56 | 0 | return 1; |
57 | 0 | } |
58 | 0 | } |
59 | 609 | a_tsk_stack->vals[a_tsk_stack->top++] = a_val; |
60 | 609 | return 0; |
61 | 609 | } |
62 | | |
63 | | /** |
64 | | * \ingroup baselib |
65 | | * Pop a value from the top of the stack. |
66 | | * @param a_tsk_stack Stack to pop from |
67 | | */ |
68 | | void |
69 | | tsk_stack_pop(TSK_STACK * a_tsk_stack) |
70 | 609 | { |
71 | 609 | a_tsk_stack->top--; |
72 | 609 | } |
73 | | |
74 | | /** |
75 | | * \ingroup baselib |
76 | | * Search a TSK_STACK for a given value |
77 | | * @param a_tsk_stack Stack to search |
78 | | * @param a_val Value to search for |
79 | | * @returns 1 if found and 0 if not |
80 | | */ |
81 | | uint8_t |
82 | | tsk_stack_find(TSK_STACK * a_tsk_stack, uint64_t a_val) |
83 | 631 | { |
84 | 631 | size_t i; |
85 | | |
86 | 663 | for (i = 0; i < a_tsk_stack->top; i++) { |
87 | 54 | if (a_tsk_stack->vals[i] == a_val) |
88 | 22 | return 1; |
89 | 54 | } |
90 | 609 | return 0; |
91 | 631 | } |
92 | | |
93 | | /** |
94 | | * \ingroup baselib |
95 | | * Free an allocated TSK_STACK structure |
96 | | * @param a_tsk_stack Stack to free |
97 | | */ |
98 | | void |
99 | | tsk_stack_free(TSK_STACK * a_tsk_stack) |
100 | 4.99k | { |
101 | 4.99k | free(a_tsk_stack->vals); |
102 | 4.99k | free(a_tsk_stack); |
103 | 4.99k | } |