Coverage Report

Created: 2026-09-03 06:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/jansson/src/strbuffer.c
Line
Count
Source
1
/*
2
 * Copyright (c) 2009-2016 Petri Lehtinen <petri@digip.org>
3
 *
4
 * Jansson is free software; you can redistribute it and/or modify
5
 * it under the terms of the MIT license. See LICENSE for details.
6
 */
7
8
#ifndef _GNU_SOURCE
9
#define _GNU_SOURCE
10
#endif
11
12
#include "strbuffer.h"
13
#include "jansson_private.h"
14
#include <stdlib.h>
15
#include <string.h>
16
17
2.87k
#define STRBUFFER_MIN_SIZE 16
18
4.52k
#define STRBUFFER_FACTOR   2
19
6.79k
#define STRBUFFER_SIZE_MAX ((size_t)(-1))
20
21
2.87k
int strbuffer_init(strbuffer_t *strbuff) {
22
2.87k
    strbuff->size = STRBUFFER_MIN_SIZE;
23
2.87k
    strbuff->length = 0;
24
25
2.87k
    strbuff->value = jsonp_malloc(strbuff->size);
26
2.87k
    if (!strbuff->value)
27
0
        return -1;
28
29
    /* initialize to empty */
30
2.87k
    strbuff->value[0] = '\0';
31
2.87k
    return 0;
32
2.87k
}
33
34
2.87k
void strbuffer_close(strbuffer_t *strbuff) {
35
2.87k
    if (strbuff->value)
36
2.86k
        jsonp_free(strbuff->value);
37
38
2.87k
    strbuff->size = 0;
39
2.87k
    strbuff->length = 0;
40
2.87k
    strbuff->value = NULL;
41
2.87k
}
42
43
204k
void strbuffer_clear(strbuffer_t *strbuff) {
44
204k
    strbuff->length = 0;
45
204k
    strbuff->value[0] = '\0';
46
204k
}
47
48
77.7k
const char *strbuffer_value(const strbuffer_t *strbuff) { return strbuff->value; }
49
50
4
char *strbuffer_steal_value(strbuffer_t *strbuff) {
51
4
    char *result = strbuff->value;
52
4
    strbuff->value = NULL;
53
4
    return result;
54
4
}
55
56
14.3M
int strbuffer_append_byte(strbuffer_t *strbuff, char byte) {
57
14.3M
    return strbuffer_append_bytes(strbuff, &byte, 1);
58
14.3M
}
59
60
14.3M
int strbuffer_append_bytes(strbuffer_t *strbuff, const char *data, size_t size) {
61
14.3M
    if (size >= strbuff->size - strbuff->length) {
62
2.26k
        size_t new_size;
63
2.26k
        char *new_value;
64
65
        /* avoid integer overflow */
66
2.26k
        if (strbuff->size > STRBUFFER_SIZE_MAX / STRBUFFER_FACTOR ||
67
2.26k
            size > STRBUFFER_SIZE_MAX - 1 ||
68
2.26k
            strbuff->length > STRBUFFER_SIZE_MAX - 1 - size)
69
0
            return -1;
70
71
2.26k
        new_size = max(strbuff->size * STRBUFFER_FACTOR, strbuff->length + size + 1);
72
73
2.26k
        new_value = jsonp_realloc(strbuff->value, strbuff->size, new_size);
74
2.26k
        if (!new_value)
75
0
            return -1;
76
77
2.26k
        strbuff->value = new_value;
78
2.26k
        strbuff->size = new_size;
79
2.26k
    }
80
81
14.3M
    memcpy(strbuff->value + strbuff->length, data, size);
82
14.3M
    strbuff->length += size;
83
14.3M
    strbuff->value[strbuff->length] = '\0';
84
85
14.3M
    return 0;
86
14.3M
}
87
88
31.2k
char strbuffer_pop(strbuffer_t *strbuff) {
89
31.2k
    if (strbuff->length > 0) {
90
31.2k
        char c = strbuff->value[--strbuff->length];
91
31.2k
        strbuff->value[strbuff->length] = '\0';
92
31.2k
        return c;
93
31.2k
    } else
94
0
        return '\0';
95
31.2k
}