1*9a0e4156SSadaf Ebrahimi /* Capstone Disassembly Engine */
2*9a0e4156SSadaf Ebrahimi /* By Nguyen Anh Quynh <[email protected]>, 2013-2015 */
3*9a0e4156SSadaf Ebrahimi
4*9a0e4156SSadaf Ebrahimi #include <stdarg.h>
5*9a0e4156SSadaf Ebrahimi #if defined(CAPSTONE_HAS_OSXKERNEL)
6*9a0e4156SSadaf Ebrahimi #include <Availability.h>
7*9a0e4156SSadaf Ebrahimi #include <libkern/libkern.h>
8*9a0e4156SSadaf Ebrahimi #include <i386/limits.h>
9*9a0e4156SSadaf Ebrahimi #else
10*9a0e4156SSadaf Ebrahimi #include <stdio.h>
11*9a0e4156SSadaf Ebrahimi #include <limits.h>
12*9a0e4156SSadaf Ebrahimi #endif
13*9a0e4156SSadaf Ebrahimi #include <string.h>
14*9a0e4156SSadaf Ebrahimi
15*9a0e4156SSadaf Ebrahimi #include <capstone/platform.h>
16*9a0e4156SSadaf Ebrahimi
17*9a0e4156SSadaf Ebrahimi #include "SStream.h"
18*9a0e4156SSadaf Ebrahimi #include "cs_priv.h"
19*9a0e4156SSadaf Ebrahimi #include "utils.h"
20*9a0e4156SSadaf Ebrahimi
21*9a0e4156SSadaf Ebrahimi #ifdef _MSC_VER
22*9a0e4156SSadaf Ebrahimi #pragma warning(disable: 4996) // disable MSVC's warning on strcpy()
23*9a0e4156SSadaf Ebrahimi #endif
24*9a0e4156SSadaf Ebrahimi
SStream_Init(SStream * ss)25*9a0e4156SSadaf Ebrahimi void SStream_Init(SStream *ss)
26*9a0e4156SSadaf Ebrahimi {
27*9a0e4156SSadaf Ebrahimi ss->index = 0;
28*9a0e4156SSadaf Ebrahimi ss->buffer[0] = '\0';
29*9a0e4156SSadaf Ebrahimi }
30*9a0e4156SSadaf Ebrahimi
SStream_concat0(SStream * ss,const char * s)31*9a0e4156SSadaf Ebrahimi void SStream_concat0(SStream *ss, const char *s)
32*9a0e4156SSadaf Ebrahimi {
33*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
34*9a0e4156SSadaf Ebrahimi unsigned int len = (unsigned int) strlen(s);
35*9a0e4156SSadaf Ebrahimi
36*9a0e4156SSadaf Ebrahimi memcpy(ss->buffer + ss->index, s, len);
37*9a0e4156SSadaf Ebrahimi ss->index += len;
38*9a0e4156SSadaf Ebrahimi ss->buffer[ss->index] = '\0';
39*9a0e4156SSadaf Ebrahimi #endif
40*9a0e4156SSadaf Ebrahimi }
41*9a0e4156SSadaf Ebrahimi
SStream_concat(SStream * ss,const char * fmt,...)42*9a0e4156SSadaf Ebrahimi void SStream_concat(SStream *ss, const char *fmt, ...)
43*9a0e4156SSadaf Ebrahimi {
44*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
45*9a0e4156SSadaf Ebrahimi va_list ap;
46*9a0e4156SSadaf Ebrahimi int ret;
47*9a0e4156SSadaf Ebrahimi
48*9a0e4156SSadaf Ebrahimi va_start(ap, fmt);
49*9a0e4156SSadaf Ebrahimi ret = cs_vsnprintf(ss->buffer + ss->index, sizeof(ss->buffer) - (ss->index + 1), fmt, ap);
50*9a0e4156SSadaf Ebrahimi va_end(ap);
51*9a0e4156SSadaf Ebrahimi ss->index += ret;
52*9a0e4156SSadaf Ebrahimi #endif
53*9a0e4156SSadaf Ebrahimi }
54*9a0e4156SSadaf Ebrahimi
55*9a0e4156SSadaf Ebrahimi // print number with prefix #
printInt64Bang(SStream * O,int64_t val)56*9a0e4156SSadaf Ebrahimi void printInt64Bang(SStream *O, int64_t val)
57*9a0e4156SSadaf Ebrahimi {
58*9a0e4156SSadaf Ebrahimi if (val >= 0) {
59*9a0e4156SSadaf Ebrahimi if (val > HEX_THRESHOLD)
60*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#0x%"PRIx64, val);
61*9a0e4156SSadaf Ebrahimi else
62*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#%"PRIu64, val);
63*9a0e4156SSadaf Ebrahimi } else {
64*9a0e4156SSadaf Ebrahimi if (val <- HEX_THRESHOLD) {
65*9a0e4156SSadaf Ebrahimi if (val == LONG_MIN)
66*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#-0x%"PRIx64, (uint64_t)val);
67*9a0e4156SSadaf Ebrahimi else
68*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#-0x%"PRIx64, (uint64_t)-val);
69*9a0e4156SSadaf Ebrahimi }
70*9a0e4156SSadaf Ebrahimi else
71*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#-%"PRIu64, -val);
72*9a0e4156SSadaf Ebrahimi }
73*9a0e4156SSadaf Ebrahimi }
74*9a0e4156SSadaf Ebrahimi
printUInt64Bang(SStream * O,uint64_t val)75*9a0e4156SSadaf Ebrahimi void printUInt64Bang(SStream *O, uint64_t val)
76*9a0e4156SSadaf Ebrahimi {
77*9a0e4156SSadaf Ebrahimi if (val > HEX_THRESHOLD)
78*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#0x%"PRIx64, val);
79*9a0e4156SSadaf Ebrahimi else
80*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#%"PRIu64, val);
81*9a0e4156SSadaf Ebrahimi }
82*9a0e4156SSadaf Ebrahimi
83*9a0e4156SSadaf Ebrahimi // print number
printInt64(SStream * O,int64_t val)84*9a0e4156SSadaf Ebrahimi void printInt64(SStream *O, int64_t val)
85*9a0e4156SSadaf Ebrahimi {
86*9a0e4156SSadaf Ebrahimi if (val >= 0) {
87*9a0e4156SSadaf Ebrahimi if (val > HEX_THRESHOLD)
88*9a0e4156SSadaf Ebrahimi SStream_concat(O, "0x%"PRIx64, val);
89*9a0e4156SSadaf Ebrahimi else
90*9a0e4156SSadaf Ebrahimi SStream_concat(O, "%"PRIu64, val);
91*9a0e4156SSadaf Ebrahimi } else {
92*9a0e4156SSadaf Ebrahimi if (val <- HEX_THRESHOLD) {
93*9a0e4156SSadaf Ebrahimi if (val == LONG_MIN)
94*9a0e4156SSadaf Ebrahimi SStream_concat(O, "-0x%"PRIx64, (uint64_t)val);
95*9a0e4156SSadaf Ebrahimi else
96*9a0e4156SSadaf Ebrahimi SStream_concat(O, "-0x%"PRIx64, (uint64_t)-val);
97*9a0e4156SSadaf Ebrahimi }
98*9a0e4156SSadaf Ebrahimi else
99*9a0e4156SSadaf Ebrahimi SStream_concat(O, "-%"PRIu64, -val);
100*9a0e4156SSadaf Ebrahimi }
101*9a0e4156SSadaf Ebrahimi }
102*9a0e4156SSadaf Ebrahimi
103*9a0e4156SSadaf Ebrahimi // print number in decimal mode
printInt32BangDec(SStream * O,int32_t val)104*9a0e4156SSadaf Ebrahimi void printInt32BangDec(SStream *O, int32_t val)
105*9a0e4156SSadaf Ebrahimi {
106*9a0e4156SSadaf Ebrahimi if (val >= 0)
107*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#%u", val);
108*9a0e4156SSadaf Ebrahimi else
109*9a0e4156SSadaf Ebrahimi if (val == INT_MIN)
110*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#-%u", val);
111*9a0e4156SSadaf Ebrahimi else
112*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#-%u", (uint32_t)-val);
113*9a0e4156SSadaf Ebrahimi }
114*9a0e4156SSadaf Ebrahimi
printInt32Bang(SStream * O,int32_t val)115*9a0e4156SSadaf Ebrahimi void printInt32Bang(SStream *O, int32_t val)
116*9a0e4156SSadaf Ebrahimi {
117*9a0e4156SSadaf Ebrahimi if (val >= 0) {
118*9a0e4156SSadaf Ebrahimi if (val > HEX_THRESHOLD)
119*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#0x%x", val);
120*9a0e4156SSadaf Ebrahimi else
121*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#%u", val);
122*9a0e4156SSadaf Ebrahimi } else {
123*9a0e4156SSadaf Ebrahimi if (val <- HEX_THRESHOLD) {
124*9a0e4156SSadaf Ebrahimi if (val == INT_MIN)
125*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#-0x%x", (uint32_t)val);
126*9a0e4156SSadaf Ebrahimi else
127*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#-0x%x", (uint32_t)-val);
128*9a0e4156SSadaf Ebrahimi }
129*9a0e4156SSadaf Ebrahimi else
130*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#-%u", -val);
131*9a0e4156SSadaf Ebrahimi }
132*9a0e4156SSadaf Ebrahimi }
133*9a0e4156SSadaf Ebrahimi
printInt32(SStream * O,int32_t val)134*9a0e4156SSadaf Ebrahimi void printInt32(SStream *O, int32_t val)
135*9a0e4156SSadaf Ebrahimi {
136*9a0e4156SSadaf Ebrahimi if (val >= 0) {
137*9a0e4156SSadaf Ebrahimi if (val > HEX_THRESHOLD)
138*9a0e4156SSadaf Ebrahimi SStream_concat(O, "0x%x", val);
139*9a0e4156SSadaf Ebrahimi else
140*9a0e4156SSadaf Ebrahimi SStream_concat(O, "%u", val);
141*9a0e4156SSadaf Ebrahimi } else {
142*9a0e4156SSadaf Ebrahimi if (val <- HEX_THRESHOLD) {
143*9a0e4156SSadaf Ebrahimi if (val == INT_MIN)
144*9a0e4156SSadaf Ebrahimi SStream_concat(O, "-0x%x", (uint32_t)val);
145*9a0e4156SSadaf Ebrahimi else
146*9a0e4156SSadaf Ebrahimi SStream_concat(O, "-0x%x", (uint32_t)-val);
147*9a0e4156SSadaf Ebrahimi }
148*9a0e4156SSadaf Ebrahimi else
149*9a0e4156SSadaf Ebrahimi SStream_concat(O, "-%u", -val);
150*9a0e4156SSadaf Ebrahimi }
151*9a0e4156SSadaf Ebrahimi }
152*9a0e4156SSadaf Ebrahimi
printUInt32Bang(SStream * O,uint32_t val)153*9a0e4156SSadaf Ebrahimi void printUInt32Bang(SStream *O, uint32_t val)
154*9a0e4156SSadaf Ebrahimi {
155*9a0e4156SSadaf Ebrahimi if (val > HEX_THRESHOLD)
156*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#0x%x", val);
157*9a0e4156SSadaf Ebrahimi else
158*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#%u", val);
159*9a0e4156SSadaf Ebrahimi }
160*9a0e4156SSadaf Ebrahimi
printUInt32(SStream * O,uint32_t val)161*9a0e4156SSadaf Ebrahimi void printUInt32(SStream *O, uint32_t val)
162*9a0e4156SSadaf Ebrahimi {
163*9a0e4156SSadaf Ebrahimi if (val > HEX_THRESHOLD)
164*9a0e4156SSadaf Ebrahimi SStream_concat(O, "0x%x", val);
165*9a0e4156SSadaf Ebrahimi else
166*9a0e4156SSadaf Ebrahimi SStream_concat(O, "%u", val);
167*9a0e4156SSadaf Ebrahimi }
168*9a0e4156SSadaf Ebrahimi
169*9a0e4156SSadaf Ebrahimi /*
170*9a0e4156SSadaf Ebrahimi int main()
171*9a0e4156SSadaf Ebrahimi {
172*9a0e4156SSadaf Ebrahimi SStream ss;
173*9a0e4156SSadaf Ebrahimi int64_t i;
174*9a0e4156SSadaf Ebrahimi
175*9a0e4156SSadaf Ebrahimi SStream_Init(&ss);
176*9a0e4156SSadaf Ebrahimi
177*9a0e4156SSadaf Ebrahimi SStream_concat(&ss, "hello ");
178*9a0e4156SSadaf Ebrahimi SStream_concat(&ss, "%d - 0x%x", 200, 16);
179*9a0e4156SSadaf Ebrahimi
180*9a0e4156SSadaf Ebrahimi i = 123;
181*9a0e4156SSadaf Ebrahimi SStream_concat(&ss, " + %ld", i);
182*9a0e4156SSadaf Ebrahimi SStream_concat(&ss, "%s", "haaaaa");
183*9a0e4156SSadaf Ebrahimi
184*9a0e4156SSadaf Ebrahimi printf("%s\n", ss.buffer);
185*9a0e4156SSadaf Ebrahimi
186*9a0e4156SSadaf Ebrahimi return 0;
187*9a0e4156SSadaf Ebrahimi }
188*9a0e4156SSadaf Ebrahimi */
189