Coverage Report

Created: 2024-04-23 06:05

/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
}