Coverage Report

Created: 2026-02-14 06:27

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/sleuthkit/tsk/base/tsk_stack.c
Line
Count
Source
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
77.6k
{
25
77.6k
    TSK_STACK *tsk_stack;
26
77.6k
    if ((tsk_stack = (TSK_STACK *) tsk_malloc(sizeof(TSK_STACK))) == NULL) {
27
0
        return NULL;
28
0
    }
29
30
77.6k
    tsk_stack->len = 64;
31
77.6k
    tsk_stack->top = 0;
32
77.6k
    if ((tsk_stack->vals =
33
77.6k
            (uint64_t *) tsk_malloc(tsk_stack->len * sizeof(uint64_t))) ==
34
77.6k
        NULL) {
35
0
        free(tsk_stack);
36
0
        return NULL;
37
0
    }
38
77.6k
    return tsk_stack;
39
77.6k
}
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
439k
{
51
439k
    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
439k
    a_tsk_stack->vals[a_tsk_stack->top++] = a_val;
60
439k
    return 0;
61
439k
}
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
434k
{
71
434k
    a_tsk_stack->top--;
72
434k
}
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
1.62M
{
84
1.62M
    size_t i;
85
86
4.81M
    for (i = 0; i < a_tsk_stack->top; i++) {
87
4.37M
        if (a_tsk_stack->vals[i] == a_val)
88
1.18M
            return 1;
89
4.37M
    }
90
439k
    return 0;
91
1.62M
}
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
77.6k
{
101
77.6k
    free(a_tsk_stack->vals);
102
77.6k
    free(a_tsk_stack);
103
77.6k
}