blob: 7caccac118d44de5655c9886effd0fbee5af4261 [file] [log] [blame]
Nguyen Anh Quynh6023ef72014-04-29 11:21:04 +08001/* Capstone Disassembly Engine */
2/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2014 */
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +08003
tandasate51eeae2016-04-23 15:58:31 -07004#if !defined(_MSC_VER) || !defined(_KERNEL_MODE)
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +08005#include <stdint.h>
tandasate51eeae2016-04-23 15:58:31 -07006#endif
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +08007#include <stdarg.h>
reverserbcf09f42015-04-09 18:28:19 +01008#if defined(CAPSTONE_HAS_OSXKERNEL)
vit969677231752018-06-15 00:12:26 +03009#include <Availability.h>
reverserbcf09f42015-04-09 18:28:19 +010010#include <libkern/libkern.h>
vit9696946fe472018-06-14 00:59:39 +030011#include <i386/limits.h>
reverserbcf09f42015-04-09 18:28:19 +010012#else
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080013#include <stdio.h>
vit9696946fe472018-06-14 00:59:39 +030014#include <limits.h>
reverserbcf09f42015-04-09 18:28:19 +010015#endif
Nguyen Anh Quynhb76233c2014-06-04 18:31:02 +080016#include <string.h>
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080017
Nguyen Anh Quynhb158b932016-04-26 09:47:30 +080018#include <platform.h>
19
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080020#include "SStream.h"
Nguyen Anh Quynhedeeb042014-01-15 20:44:03 +080021#include "cs_priv.h"
Nguyen Anh Quynh46a74e52014-08-25 16:47:12 +080022#include "utils.h"
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080023
Nguyen Anh Quynh476d5ad2014-06-17 15:09:59 +080024#ifdef _MSC_VER
25#pragma warning(disable: 4996) // disable MSVC's warning on strcpy()
26#endif
27
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080028void SStream_Init(SStream *ss)
29{
30 ss->index = 0;
31 ss->buffer[0] = '\0';
32}
33
Richard Henderson22ead3e2017-10-21 17:45:40 -070034void SStream_concat0(SStream *ss, const char *s)
Nguyen Anh Quynhb76233c2014-06-04 18:31:02 +080035{
36#ifndef CAPSTONE_DIET
flyingsymbolsd91f9642014-10-22 03:21:43 -040037 unsigned int len = (unsigned int) strlen(s);
Nguyen Anh Quynhea3c0892014-10-02 10:17:55 +080038
39 memcpy(ss->buffer + ss->index, s, len);
40 ss->index += len;
41 ss->buffer[ss->index] = '\0';
Nguyen Anh Quynhb76233c2014-06-04 18:31:02 +080042#endif
43}
44
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080045void SStream_concat(SStream *ss, const char *fmt, ...)
46{
Nguyen Anh Quynhfc83a432014-02-22 23:26:27 +080047#ifndef CAPSTONE_DIET
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080048 va_list ap;
Nguyen Anh Quynhbb0744d2014-05-12 13:41:49 +080049 int ret;
50
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080051 va_start(ap, fmt);
Axel 0vercl0k Souchet779d4c72014-05-08 23:44:49 +010052 ret = cs_vsnprintf(ss->buffer + ss->index, sizeof(ss->buffer) - (ss->index + 1), fmt, ap);
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080053 va_end(ap);
54 ss->index += ret;
Nguyen Anh Quynhfc83a432014-02-22 23:26:27 +080055#endif
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080056}
57
Nguyen Anh Quynh46a74e52014-08-25 16:47:12 +080058// print number with prefix #
59void printInt64Bang(SStream *O, int64_t val)
60{
61 if (val >= 0) {
62 if (val > HEX_THRESHOLD)
63 SStream_concat(O, "#0x%"PRIx64, val);
64 else
65 SStream_concat(O, "#%"PRIu64, val);
66 } else {
67 if (val <- HEX_THRESHOLD)
Catena cybera0a7b202018-06-02 16:20:13 +020068 if (val == LONG_MIN)
69 SStream_concat(O, "#-0x%"PRIx64, val);
70 else
71 SStream_concat(O, "#-0x%"PRIx64, -val);
Nguyen Anh Quynh46a74e52014-08-25 16:47:12 +080072 else
73 SStream_concat(O, "#-%"PRIu64, -val);
74 }
75}
76
Nguyen Anh Quynh03a18362014-12-12 22:06:06 +080077void printUInt64Bang(SStream *O, uint64_t val)
78{
79 if (val > HEX_THRESHOLD)
80 SStream_concat(O, "#0x%"PRIx64, val);
81 else
82 SStream_concat(O, "#%"PRIu64, val);
83}
84
Nguyen Anh Quynh46a74e52014-08-25 16:47:12 +080085// print number
86void printInt64(SStream *O, int64_t val)
87{
88 if (val >= 0) {
89 if (val > HEX_THRESHOLD)
90 SStream_concat(O, "0x%"PRIx64, val);
91 else
92 SStream_concat(O, "%"PRIu64, val);
93 } else {
94 if (val <- HEX_THRESHOLD)
Catena cybera0a7b202018-06-02 16:20:13 +020095 if (val == LONG_MIN)
96 SStream_concat(O, "-0x%"PRIx64, val);
97 else
98 SStream_concat(O, "-0x%"PRIx64, -val);
Nguyen Anh Quynh46a74e52014-08-25 16:47:12 +080099 else
100 SStream_concat(O, "-%"PRIu64, -val);
101 }
102}
103
Nguyen Anh Quynhc109e8e2014-11-08 13:58:50 +0800104// print number in decimal mode
105void printInt32BangDec(SStream *O, int32_t val)
106{
107 if (val >= 0)
108 SStream_concat(O, "#%u", val);
109 else
Catena cybera0a7b202018-06-02 16:20:13 +0200110 if (val == INT_MIN)
111 SStream_concat(O, "#-%u", val);
112 else
113 SStream_concat(O, "#-%u", -val);
Nguyen Anh Quynhc109e8e2014-11-08 13:58:50 +0800114}
115
Nguyen Anh Quynh46a74e52014-08-25 16:47:12 +0800116void printInt32Bang(SStream *O, int32_t val)
117{
118 if (val >= 0) {
119 if (val > HEX_THRESHOLD)
120 SStream_concat(O, "#0x%x", val);
121 else
122 SStream_concat(O, "#%u", val);
123 } else {
124 if (val <- HEX_THRESHOLD)
Catena cybera0a7b202018-06-02 16:20:13 +0200125 if (val == INT_MIN)
126 SStream_concat(O, "#-0x%x", val);
127 else
128 SStream_concat(O, "#-0x%x", -val);
Nguyen Anh Quynh46a74e52014-08-25 16:47:12 +0800129 else
130 SStream_concat(O, "#-%u", -val);
131 }
132}
133
134void printInt32(SStream *O, int32_t val)
135{
136 if (val >= 0) {
137 if (val > HEX_THRESHOLD)
138 SStream_concat(O, "0x%x", val);
139 else
140 SStream_concat(O, "%u", val);
141 } else {
142 if (val <- HEX_THRESHOLD)
Catena cybera0a7b202018-06-02 16:20:13 +0200143 if (val == INT_MIN)
144 SStream_concat(O, "-0x%x", val);
145 else
146 SStream_concat(O, "-0x%x", -val);
Nguyen Anh Quynh46a74e52014-08-25 16:47:12 +0800147 else
148 SStream_concat(O, "-%u", -val);
149 }
150}
151
152void printUInt32Bang(SStream *O, uint32_t val)
153{
154 if (val > HEX_THRESHOLD)
155 SStream_concat(O, "#0x%x", val);
156 else
157 SStream_concat(O, "#%u", val);
158}
159
160void printUInt32(SStream *O, uint32_t val)
161{
162 if (val > HEX_THRESHOLD)
163 SStream_concat(O, "0x%x", val);
164 else
165 SStream_concat(O, "%u", val);
166}
167
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +0800168/*
169 int main()
170 {
171 SStream ss;
172 int64_t i;
173
174 SStream_Init(&ss);
175
176 SStream_concat(&ss, "hello ");
177 SStream_concat(&ss, "%d - 0x%x", 200, 16);
178
179 i = 123;
180 SStream_concat(&ss, " + %ld", i);
181 SStream_concat(&ss, "%s", "haaaaa");
182
183 printf("%s\n", ss.buffer);
184
185 return 0;
186 }
187 */