Coverage Report

Created: 2026-03-13 06:50

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/capstonev5/SStream.c
Line
Count
Source
1
/* Capstone Disassembly Engine */
2
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2019 */
3
4
#include <stdarg.h>
5
#if defined(CAPSTONE_HAS_OSXKERNEL)
6
#include <Availability.h>
7
#include <libkern/libkern.h>
8
#include <i386/limits.h>
9
#else
10
#include <stdio.h>
11
#include <limits.h>
12
#endif
13
#include <string.h>
14
15
#include <capstone/platform.h>
16
17
#include "SStream.h"
18
#include "cs_priv.h"
19
#include "utils.h"
20
21
#ifdef _MSC_VER
22
#pragma warning(disable: 4996) // disable MSVC's warning on strcpy()
23
#endif
24
25
void SStream_Init(SStream *ss)
26
2.83M
{
27
2.83M
  ss->index = 0;
28
2.83M
  ss->buffer[0] = '\0';
29
2.83M
}
30
31
void SStream_concat0(SStream *ss, const char *s)
32
12.7M
{
33
12.7M
#ifndef CAPSTONE_DIET
34
12.7M
  unsigned int len = (unsigned int) strlen(s);
35
36
12.7M
  SSTREAM_OVERFLOW_CHECK(ss, len);
37
12.7M
  memcpy(ss->buffer + ss->index, s, len);
38
12.7M
  ss->index += len;
39
12.7M
  ss->buffer[ss->index] = '\0';
40
12.7M
#endif
41
12.7M
}
42
43
void SStream_concat1(SStream *ss, const char c)
44
310k
{
45
310k
#ifndef CAPSTONE_DIET
46
310k
  SSTREAM_OVERFLOW_CHECK(ss, 1);
47
310k
  ss->buffer[ss->index] = c;
48
310k
  ss->index++;
49
310k
  ss->buffer[ss->index] = '\0';
50
310k
#endif
51
310k
}
52
53
void SStream_concat(SStream *ss, const char *fmt, ...)
54
3.84M
{
55
3.84M
#ifndef CAPSTONE_DIET
56
3.84M
  va_list ap;
57
3.84M
  int ret;
58
59
3.84M
  va_start(ap, fmt);
60
3.84M
  ret = cs_vsnprintf(ss->buffer + ss->index, sizeof(ss->buffer) - (ss->index + 1), fmt, ap);
61
3.84M
  va_end(ap);
62
3.84M
  if (ret < 0) {
63
0
    return;
64
0
  }
65
3.84M
  SSTREAM_OVERFLOW_CHECK(ss, ret);
66
3.84M
  ss->index += ret;
67
3.84M
#endif
68
3.84M
}
69
70
// print number with prefix #
71
void printInt64Bang(SStream *O, int64_t val)
72
50.4k
{
73
50.4k
  if (val >= 0) {
74
31.2k
    if (val > HEX_THRESHOLD)
75
25.4k
      SStream_concat(O, "#0x%"PRIx64, val);
76
5.80k
    else
77
5.80k
      SStream_concat(O, "#%"PRIu64, val);
78
31.2k
  } else {
79
19.2k
    if (val <- HEX_THRESHOLD) {
80
17.1k
      if (val == LONG_MIN)
81
94
        SStream_concat(O, "#-0x%"PRIx64, (uint64_t)val);
82
17.0k
      else
83
17.0k
        SStream_concat(O, "#-0x%"PRIx64, (uint64_t)-val);
84
17.1k
    } else
85
2.10k
      SStream_concat(O, "#-%"PRIu64, -val);
86
19.2k
  }
87
50.4k
}
88
89
void printUInt64Bang(SStream *O, uint64_t val)
90
61.9k
{
91
61.9k
  if (val > HEX_THRESHOLD)
92
42.1k
    SStream_concat(O, "#0x%"PRIx64, val);
93
19.8k
  else
94
19.8k
    SStream_concat(O, "#%"PRIu64, val);
95
61.9k
}
96
97
// print number
98
void printInt64(SStream *O, int64_t val)
99
227k
{
100
227k
  if (val >= 0) {
101
170k
    if (val > HEX_THRESHOLD)
102
136k
      SStream_concat(O, "0x%"PRIx64, val);
103
33.7k
    else
104
33.7k
      SStream_concat(O, "%"PRIu64, val);
105
170k
  } else {
106
56.9k
    if (val <- HEX_THRESHOLD) {
107
53.7k
      if (val == LONG_MIN)
108
0
        SStream_concat(O, "-0x%"PRIx64, (uint64_t)val);
109
53.7k
      else
110
53.7k
        SStream_concat(O, "-0x%"PRIx64, (uint64_t)-val);
111
53.7k
    } else
112
3.21k
      SStream_concat(O, "-%"PRIu64, -val);
113
56.9k
  }
114
227k
}
115
116
void printUInt64(SStream *O, uint64_t val)
117
10.3k
{
118
10.3k
  if (val > HEX_THRESHOLD)
119
10.2k
    SStream_concat(O, "0x%"PRIx64, val);
120
107
  else
121
107
    SStream_concat(O, "%"PRIu64, val);
122
10.3k
}
123
124
// print number in decimal mode
125
void printInt32BangDec(SStream *O, int32_t val)
126
11.5k
{
127
11.5k
  if (val >= 0)
128
11.5k
    SStream_concat(O, "#%u", val);
129
0
  else {
130
0
    if (val == INT_MIN)
131
0
      SStream_concat(O, "#-%u", val);
132
0
    else
133
0
      SStream_concat(O, "#-%u", (uint32_t)-val);
134
0
  }
135
11.5k
}
136
137
void printInt32Bang(SStream *O, int32_t val)
138
157k
{
139
157k
  if (val >= 0) {
140
155k
    if (val > HEX_THRESHOLD)
141
86.6k
      SStream_concat(O, "#0x%x", val);
142
68.3k
    else
143
68.3k
      SStream_concat(O, "#%u", val);
144
155k
  } else {
145
2.10k
    if (val <- HEX_THRESHOLD) {
146
1.68k
      if (val == INT_MIN)
147
11
        SStream_concat(O, "#-0x%x", (uint32_t)val);
148
1.67k
      else
149
1.67k
        SStream_concat(O, "#-0x%x", (uint32_t)-val);
150
1.68k
    } else
151
424
      SStream_concat(O, "#-%u", -val);
152
2.10k
  }
153
157k
}
154
155
void printInt32(SStream *O, int32_t val)
156
89.1k
{
157
89.1k
  if (val >= 0) {
158
76.6k
    if (val > HEX_THRESHOLD)
159
30.9k
      SStream_concat(O, "0x%x", val);
160
45.6k
    else
161
45.6k
      SStream_concat(O, "%u", val);
162
76.6k
  } else {
163
12.5k
    if (val <- HEX_THRESHOLD) {
164
12.1k
      if (val == INT_MIN)
165
62
        SStream_concat(O, "-0x%x", (uint32_t)val);
166
12.1k
      else
167
12.1k
        SStream_concat(O, "-0x%x", (uint32_t)-val);
168
12.1k
    } else
169
377
      SStream_concat(O, "-%u", -val);
170
12.5k
  }
171
89.1k
}
172
173
void printUInt32Bang(SStream *O, uint32_t val)
174
185k
{
175
185k
  if (val > HEX_THRESHOLD)
176
158k
    SStream_concat(O, "#0x%x", val);
177
26.2k
  else
178
26.2k
    SStream_concat(O, "#%u", val);
179
185k
}
180
181
void printUInt32(SStream *O, uint32_t val)
182
62.3k
{
183
62.3k
  if (val > HEX_THRESHOLD)
184
18.9k
    SStream_concat(O, "0x%x", val);
185
43.4k
  else
186
43.4k
    SStream_concat(O, "%u", val);
187
62.3k
}