Home | History | Annotate | Download | only in capstone
      1 /* Capstone Disassembly Engine */
      2 /* By Nguyen Anh Quynh <aquynh (at) gmail.com>, 2013-2014 */
      3 
      4 #if !defined(_MSC_VER) || !defined(_KERNEL_MODE)
      5 #include <stdint.h>
      6 #endif
      7 #include <stdarg.h>
      8 #if defined(CAPSTONE_HAS_OSXKERNEL)
      9 #include <libkern/libkern.h>
     10 #else
     11 #include <stdio.h>
     12 #endif
     13 #include <string.h>
     14 
     15 #include <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, 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_concat(SStream *ss, const char *fmt, ...)
     43 {
     44 #ifndef CAPSTONE_DIET
     45 	va_list ap;
     46 	int ret;
     47 
     48 	va_start(ap, fmt);
     49 	ret = cs_vsnprintf(ss->buffer + ss->index, sizeof(ss->buffer) - (ss->index + 1), fmt, ap);
     50 	va_end(ap);
     51 	ss->index += ret;
     52 #endif
     53 }
     54 
     55 // print number with prefix #
     56 void printInt64Bang(SStream *O, int64_t val)
     57 {
     58 	if (val >= 0) {
     59 		if (val > HEX_THRESHOLD)
     60 			SStream_concat(O, "#0x%"PRIx64, val);
     61 		else
     62 			SStream_concat(O, "#%"PRIu64, val);
     63 	} else {
     64 		if (val <- HEX_THRESHOLD)
     65 			SStream_concat(O, "#-0x%"PRIx64, -val);
     66 		else
     67 			SStream_concat(O, "#-%"PRIu64, -val);
     68 	}
     69 }
     70 
     71 void printUInt64Bang(SStream *O, uint64_t val)
     72 {
     73 	if (val > HEX_THRESHOLD)
     74 		SStream_concat(O, "#0x%"PRIx64, val);
     75 	else
     76 		SStream_concat(O, "#%"PRIu64, val);
     77 }
     78 
     79 // print number
     80 void printInt64(SStream *O, int64_t val)
     81 {
     82 	if (val >= 0) {
     83 		if (val > HEX_THRESHOLD)
     84 			SStream_concat(O, "0x%"PRIx64, val);
     85 		else
     86 			SStream_concat(O, "%"PRIu64, val);
     87 	} else {
     88 		if (val <- HEX_THRESHOLD)
     89 			SStream_concat(O, "-0x%"PRIx64, -val);
     90 		else
     91 			SStream_concat(O, "-%"PRIu64, -val);
     92 	}
     93 }
     94 
     95 // print number in decimal mode
     96 void printInt32BangDec(SStream *O, int32_t val)
     97 {
     98 	if (val >= 0)
     99 		SStream_concat(O, "#%u", val);
    100 	else
    101 		SStream_concat(O, "#-%u", -val);
    102 }
    103 
    104 void printInt32Bang(SStream *O, int32_t val)
    105 {
    106 	if (val >= 0) {
    107 		if (val > HEX_THRESHOLD)
    108 			SStream_concat(O, "#0x%x", val);
    109 		else
    110 			SStream_concat(O, "#%u", val);
    111 	} else {
    112 		if (val <- HEX_THRESHOLD)
    113 			SStream_concat(O, "#-0x%x", -val);
    114 		else
    115 			SStream_concat(O, "#-%u", -val);
    116 	}
    117 }
    118 
    119 void printInt32(SStream *O, int32_t val)
    120 {
    121 	if (val >= 0) {
    122 		if (val > HEX_THRESHOLD)
    123 			SStream_concat(O, "0x%x", val);
    124 		else
    125 			SStream_concat(O, "%u", val);
    126 	} else {
    127 		if (val <- HEX_THRESHOLD)
    128 			SStream_concat(O, "-0x%x", -val);
    129 		else
    130 			SStream_concat(O, "-%u", -val);
    131 	}
    132 }
    133 
    134 void printUInt32Bang(SStream *O, uint32_t val)
    135 {
    136 	if (val > HEX_THRESHOLD)
    137 		SStream_concat(O, "#0x%x", val);
    138 	else
    139 		SStream_concat(O, "#%u", val);
    140 }
    141 
    142 void printUInt32(SStream *O, uint32_t val)
    143 {
    144 	if (val > HEX_THRESHOLD)
    145 		SStream_concat(O, "0x%x", val);
    146 	else
    147 		SStream_concat(O, "%u", val);
    148 }
    149 
    150 /*
    151    int main()
    152    {
    153    SStream ss;
    154    int64_t i;
    155 
    156    SStream_Init(&ss);
    157 
    158    SStream_concat(&ss, "hello ");
    159    SStream_concat(&ss, "%d - 0x%x", 200, 16);
    160 
    161    i = 123;
    162    SStream_concat(&ss, " + %ld", i);
    163    SStream_concat(&ss, "%s", "haaaaa");
    164 
    165    printf("%s\n", ss.buffer);
    166 
    167    return 0;
    168    }
    169  */
    170