Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wine-mirror
GitHub Repository: wine-mirror/wine
Path: blob/master/libs/capstone/SStream.c
4387 views
1
/* Capstone Disassembly Engine */
2
/* By Nguyen Anh Quynh <[email protected]>, 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
{
27
ss->index = 0;
28
ss->buffer[0] = '\0';
29
}
30
31
void SStream_concat0(SStream *ss, const char *s)
32
{
33
#ifndef CAPSTONE_DIET
34
unsigned int len = (unsigned int) strlen(s);
35
36
memcpy(ss->buffer + ss->index, s, len);
37
ss->index += len;
38
ss->buffer[ss->index] = '\0';
39
#endif
40
}
41
42
void SStream_concat1(SStream *ss, const char c)
43
{
44
#ifndef CAPSTONE_DIET
45
ss->buffer[ss->index] = c;
46
ss->index++;
47
ss->buffer[ss->index] = '\0';
48
#endif
49
}
50
51
void SStream_concat(SStream *ss, const char *fmt, ...)
52
{
53
#ifndef CAPSTONE_DIET
54
va_list ap;
55
int ret;
56
57
va_start(ap, fmt);
58
ret = cs_vsnprintf(ss->buffer + ss->index, sizeof(ss->buffer) - (ss->index + 1), fmt, ap);
59
va_end(ap);
60
ss->index += ret;
61
#endif
62
}
63
64
// print number with prefix #
65
void printInt64Bang(SStream *O, int64_t val)
66
{
67
if (val >= 0) {
68
if (val > HEX_THRESHOLD)
69
SStream_concat(O, "#0x%"PRIx64, val);
70
else
71
SStream_concat(O, "#%"PRIu64, val);
72
} else {
73
if (val <- HEX_THRESHOLD) {
74
if (val == LONG_MIN)
75
SStream_concat(O, "#-0x%"PRIx64, (uint64_t)val);
76
else
77
SStream_concat(O, "#-0x%"PRIx64, (uint64_t)-val);
78
} else
79
SStream_concat(O, "#-%"PRIu64, -val);
80
}
81
}
82
83
void printUInt64Bang(SStream *O, uint64_t val)
84
{
85
if (val > HEX_THRESHOLD)
86
SStream_concat(O, "#0x%"PRIx64, val);
87
else
88
SStream_concat(O, "#%"PRIu64, val);
89
}
90
91
// print number
92
void printInt64(SStream *O, int64_t val)
93
{
94
if (val >= 0) {
95
if (val > HEX_THRESHOLD)
96
SStream_concat(O, "0x%"PRIx64, val);
97
else
98
SStream_concat(O, "%"PRIu64, val);
99
} else {
100
if (val <- HEX_THRESHOLD) {
101
if (val == LONG_MIN)
102
SStream_concat(O, "-0x%"PRIx64, (uint64_t)val);
103
else
104
SStream_concat(O, "-0x%"PRIx64, (uint64_t)-val);
105
} else
106
SStream_concat(O, "-%"PRIu64, -val);
107
}
108
}
109
110
void printUInt64(SStream *O, uint64_t val)
111
{
112
if (val > HEX_THRESHOLD)
113
SStream_concat(O, "0x%"PRIx64, val);
114
else
115
SStream_concat(O, "%"PRIu64, val);
116
}
117
118
// print number in decimal mode
119
void printInt32BangDec(SStream *O, int32_t val)
120
{
121
if (val >= 0)
122
SStream_concat(O, "#%u", val);
123
else {
124
if (val == INT_MIN)
125
SStream_concat(O, "#-%u", val);
126
else
127
SStream_concat(O, "#-%u", (uint32_t)-val);
128
}
129
}
130
131
void printInt32Bang(SStream *O, int32_t val)
132
{
133
if (val >= 0) {
134
if (val > HEX_THRESHOLD)
135
SStream_concat(O, "#0x%x", val);
136
else
137
SStream_concat(O, "#%u", val);
138
} else {
139
if (val <- HEX_THRESHOLD) {
140
if (val == INT_MIN)
141
SStream_concat(O, "#-0x%x", (uint32_t)val);
142
else
143
SStream_concat(O, "#-0x%x", (uint32_t)-val);
144
} else
145
SStream_concat(O, "#-%u", -val);
146
}
147
}
148
149
void printInt32(SStream *O, int32_t val)
150
{
151
if (val >= 0) {
152
if (val > HEX_THRESHOLD)
153
SStream_concat(O, "0x%x", val);
154
else
155
SStream_concat(O, "%u", val);
156
} else {
157
if (val <- HEX_THRESHOLD) {
158
if (val == INT_MIN)
159
SStream_concat(O, "-0x%x", (uint32_t)val);
160
else
161
SStream_concat(O, "-0x%x", (uint32_t)-val);
162
} else
163
SStream_concat(O, "-%u", -val);
164
}
165
}
166
167
void printUInt32Bang(SStream *O, uint32_t val)
168
{
169
if (val > HEX_THRESHOLD)
170
SStream_concat(O, "#0x%x", val);
171
else
172
SStream_concat(O, "#%u", val);
173
}
174
175
void printUInt32(SStream *O, uint32_t val)
176
{
177
if (val > HEX_THRESHOLD)
178
SStream_concat(O, "0x%x", val);
179
else
180
SStream_concat(O, "%u", val);
181
}
182
183