Coverage Report

Created: 2025-10-10 06:20

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
1.12M
{
27
1.12M
  ss->index = 0;
28
1.12M
  ss->buffer[0] = '\0';
29
1.12M
}
30
31
void SStream_concat0(SStream *ss, const char *s)
32
5.12M
{
33
5.12M
#ifndef CAPSTONE_DIET
34
5.12M
  unsigned int len = (unsigned int) strlen(s);
35
36
5.12M
  memcpy(ss->buffer + ss->index, s, len);
37
5.12M
  ss->index += len;
38
5.12M
  ss->buffer[ss->index] = '\0';
39
5.12M
#endif
40
5.12M
}
41
42
void SStream_concat1(SStream *ss, const char c)
43
205k
{
44
205k
#ifndef CAPSTONE_DIET
45
205k
  ss->buffer[ss->index] = c;
46
205k
  ss->index++;
47
205k
  ss->buffer[ss->index] = '\0';
48
205k
#endif
49
205k
}
50
51
void SStream_concat(SStream *ss, const char *fmt, ...)
52
1.56M
{
53
1.56M
#ifndef CAPSTONE_DIET
54
1.56M
  va_list ap;
55
1.56M
  int ret;
56
57
1.56M
  va_start(ap, fmt);
58
1.56M
  ret = cs_vsnprintf(ss->buffer + ss->index, sizeof(ss->buffer) - (ss->index + 1), fmt, ap);
59
1.56M
  va_end(ap);
60
1.56M
  ss->index += ret;
61
1.56M
#endif
62
1.56M
}
63
64
// print number with prefix #
65
void printInt64Bang(SStream *O, int64_t val)
66
24.1k
{
67
24.1k
  if (val >= 0) {
68
15.6k
    if (val > HEX_THRESHOLD)
69
12.9k
      SStream_concat(O, "#0x%"PRIx64, val);
70
2.65k
    else
71
2.65k
      SStream_concat(O, "#%"PRIu64, val);
72
15.6k
  } else {
73
8.59k
    if (val <- HEX_THRESHOLD) {
74
7.73k
      if (val == LONG_MIN)
75
8
        SStream_concat(O, "#-0x%"PRIx64, (uint64_t)val);
76
7.72k
      else
77
7.72k
        SStream_concat(O, "#-0x%"PRIx64, (uint64_t)-val);
78
7.73k
    } else
79
855
      SStream_concat(O, "#-%"PRIu64, -val);
80
8.59k
  }
81
24.1k
}
82
83
void printUInt64Bang(SStream *O, uint64_t val)
84
30.6k
{
85
30.6k
  if (val > HEX_THRESHOLD)
86
20.2k
    SStream_concat(O, "#0x%"PRIx64, val);
87
10.3k
  else
88
10.3k
    SStream_concat(O, "#%"PRIu64, val);
89
30.6k
}
90
91
// print number
92
void printInt64(SStream *O, int64_t val)
93
95.8k
{
94
95.8k
  if (val >= 0) {
95
72.0k
    if (val > HEX_THRESHOLD)
96
55.0k
      SStream_concat(O, "0x%"PRIx64, val);
97
17.0k
    else
98
17.0k
      SStream_concat(O, "%"PRIu64, val);
99
72.0k
  } else {
100
23.8k
    if (val <- HEX_THRESHOLD) {
101
22.0k
      if (val == LONG_MIN)
102
0
        SStream_concat(O, "-0x%"PRIx64, (uint64_t)val);
103
22.0k
      else
104
22.0k
        SStream_concat(O, "-0x%"PRIx64, (uint64_t)-val);
105
22.0k
    } else
106
1.75k
      SStream_concat(O, "-%"PRIu64, -val);
107
23.8k
  }
108
95.8k
}
109
110
void printUInt64(SStream *O, uint64_t val)
111
5.09k
{
112
5.09k
  if (val > HEX_THRESHOLD)
113
4.95k
    SStream_concat(O, "0x%"PRIx64, val);
114
134
  else
115
134
    SStream_concat(O, "%"PRIu64, val);
116
5.09k
}
117
118
// print number in decimal mode
119
void printInt32BangDec(SStream *O, int32_t val)
120
4.90k
{
121
4.90k
  if (val >= 0)
122
4.90k
    SStream_concat(O, "#%u", val);
123
0
  else {
124
0
    if (val == INT_MIN)
125
0
      SStream_concat(O, "#-%u", val);
126
0
    else
127
0
      SStream_concat(O, "#-%u", (uint32_t)-val);
128
0
  }
129
4.90k
}
130
131
void printInt32Bang(SStream *O, int32_t val)
132
57.3k
{
133
57.3k
  if (val >= 0) {
134
56.3k
    if (val > HEX_THRESHOLD)
135
33.8k
      SStream_concat(O, "#0x%x", val);
136
22.5k
    else
137
22.5k
      SStream_concat(O, "#%u", val);
138
56.3k
  } else {
139
1.00k
    if (val <- HEX_THRESHOLD) {
140
954
      if (val == INT_MIN)
141
172
        SStream_concat(O, "#-0x%x", (uint32_t)val);
142
782
      else
143
782
        SStream_concat(O, "#-0x%x", (uint32_t)-val);
144
954
    } else
145
47
      SStream_concat(O, "#-%u", -val);
146
1.00k
  }
147
57.3k
}
148
149
void printInt32(SStream *O, int32_t val)
150
43.9k
{
151
43.9k
  if (val >= 0) {
152
39.2k
    if (val > HEX_THRESHOLD)
153
11.4k
      SStream_concat(O, "0x%x", val);
154
27.8k
    else
155
27.8k
      SStream_concat(O, "%u", val);
156
39.2k
  } else {
157
4.67k
    if (val <- HEX_THRESHOLD) {
158
4.62k
      if (val == INT_MIN)
159
40
        SStream_concat(O, "-0x%x", (uint32_t)val);
160
4.58k
      else
161
4.58k
        SStream_concat(O, "-0x%x", (uint32_t)-val);
162
4.62k
    } else
163
51
      SStream_concat(O, "-%u", -val);
164
4.67k
  }
165
43.9k
}
166
167
void printUInt32Bang(SStream *O, uint32_t val)
168
60.4k
{
169
60.4k
  if (val > HEX_THRESHOLD)
170
49.8k
    SStream_concat(O, "#0x%x", val);
171
10.5k
  else
172
10.5k
    SStream_concat(O, "#%u", val);
173
60.4k
}
174
175
void printUInt32(SStream *O, uint32_t val)
176
26.7k
{
177
26.7k
  if (val > HEX_THRESHOLD)
178
8.41k
    SStream_concat(O, "0x%x", val);
179
18.3k
  else
180
18.3k
    SStream_concat(O, "%u", val);
181
26.7k
}