1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266
|
/* radare - LGPL - Copyright 2007-2013 - pancake */
#include <r_util.h>
#include <r_print.h>
#include "../blob/version.c"
#define STDIN_BUFFER_SIZE 354096
static RNum *num;
static int help ();
static ut64 flags = 0;
static int use_stdin ();
static int rax (char *str, int len, int last);
static int format_output (char mode, const char *s) {
ut64 n = r_num_math (num, s);
const char *str = (char*) &n;
char strbits[65];
if (flags & 2) {
/* swap endian */
ut32 n2 = (n>>32)? 8:4;
r_mem_copyendian ((ut8*) str, (ut8*) str, n2, 0);
}
switch (mode) {
case 'I': printf ("%"PFMT64d"\n", n); break;
case '0': printf ("0x%"PFMT64x"\n", n); break;
case 'F': printf ("%ff\n", (float)(ut32)n); break;
case 'f': printf ("%.01lf\n", num->fvalue); break;
case 'O': printf ("%"PFMT64o"\n", n); break;
case 'B':
if (n) {
r_num_to_bits (strbits, n);
printf ("%sb\n", strbits);
} else printf ("0b\n");
break;
}
return R_TRUE;
}
static int help () {
printf (
" int -> hex ; rax2 10\n"
" hex -> int ; rax2 0xa\n"
" -int -> hex ; rax2 -77\n"
" -hex -> int ; rax2 0xffffffb3\n"
" int -> bin ; rax2 b30\n"
" bin -> int ; rax2 1010d\n"
" float -> hex ; rax2 3.33f\n"
" hex -> float ; rax2 Fx40551ed8\n"
" oct -> hex ; rax2 35o\n"
" hex -> oct ; rax2 Ox12 (O is a letter)\n"
" bin -> hex ; rax2 1100011b\n"
" hex -> bin ; rax2 Bx63\n"
" raw -> hex ; rax2 -S < /binfile\n"
" hex -> raw ; rax2 -s 414141\n"
" -b binstr -> bin ; rax2 -b 01000101 01110110\n"
" -B keep base ; rax2 -B 33+3 -> 36\n"
" -d force integer ; rax2 -d 3 -> 3 instead of 0x3\n"
" -e swap endianness ; rax2 -e 0x33\n"
" -f floating point ; rax2 -f 6.3+2.1\n"
" -h help ; rax2 -h\n"
" -k randomart ; rax2 -k 0x34 1020304050\n"
" -n binary number ; rax2 -e 0x1234 # 34120000\n"
" -s hexstr -> raw ; rax2 -s 43 4a 50\n"
" -S raw -> hexstr ; rax2 -S < /bin/ls > ls.hex\n"
" -t tstamp -> str ; rax2 -t 1234567890\n"
" -x hash string ; rax2 -x linux osx\n"
" -u units ; rax2 -u 389289238 # 317.0M\n"
" -v version ; rax2 -V\n"
);
return R_TRUE;
}
static int rax (char *str, int len, int last) {
float f;
ut8 *buf;
char *p, out_mode = (flags&128)? 'I': '0';
int i;
if (!(flags&4) || !len)
len = strlen (str);
if ((flags & 4))
goto dotherax;
if (*str=='-') {
while (str[1] && str[1]!=' ') {
switch (str[1]) {
case 's': flags ^= 1; break;
case 'e': flags ^= 2; break;
case 'S': flags ^= 4; break;
case 'b': flags ^= 8; break;
case 'x': flags ^= 16; break;
case 'B': flags ^= 32; break;
case 'f': flags ^= 64; break;
case 'd': flags ^=128; break;
case 'k': flags ^=256; break;
case 'n': flags ^=512; break;
case 'u': flags ^=1024;break;
case 't': flags ^=2048;break;
case 'v': blob_version ("rax2"); break;
case '\0': return !use_stdin ();
default:
out_mode = (flags^32)? '0': 'I';
if (str[1]>='0' && str[1]<='9')
return format_output (out_mode, str);
printf ("Usage: rax2 [options] [expr ...]\n");
return help ();
}
str++;
}
if (last)
return !use_stdin ();
return R_TRUE;
}
if (*str=='q')
return R_FALSE;
if (*str=='h' || *str=='?')
return help ();
dotherax:
if (flags & 512) { // -k
ut32 n = r_num_math (num, str);
ut8 *np = (ut8*)&n;
if (flags & 1) fwrite (&n, sizeof (n), 1, stdout);
else printf ("%02x%02x%02x%02x\n",
np[0], np[1], np[2], np[3]);
fflush (stdout);
return R_TRUE;
}
if (flags & 256) { // -k
int n = ((strlen (str))>>1)+1;
char *s;
ut32 *m;
buf = (ut8*) malloc (n);
m = (ut32 *) buf;
memset (buf, '\0', n);
n = r_hex_str2bin (str, (ut8*)buf);
if (n<1 || !memcmp (str, "0x", 2)) {
ut64 q = r_num_math (num, str);
s = r_print_randomart ((ut8*)&q, sizeof (q), q);
printf ("%s\n", s);
free (s);
} else {
s = r_print_randomart ((ut8*)buf, n, *m);
printf ("%s\n", s);
free (s);
}
return R_TRUE;
}
if (flags & 1) { // -s
ut64 n = ((strlen (str))>>1)+1;
buf = malloc (n);
memset (buf, '\0', n);
n = r_hex_str2bin (str, (ut8*)buf);
fwrite (buf, n, 1, stdout);
#if __EMSCRIPTEN__
puts ("");
#endif
fflush (stdout);
free (buf);
return R_TRUE;
}
if (flags & 4) { // -S
for (i=0; i<len; i++)
printf ("%02x", (ut8)str[i]);
printf ("\n");
return R_TRUE;
}
if (flags & 8) {
int i, len;
ut8 buf[4096];
len = r_str_binstr2bin (str, buf, sizeof (buf));
if (len>0)
for (i=0; i<len; i++)
printf ("%c", buf[i]);
return R_TRUE;
}
if (flags & 1024) {
char buf[80];
r_num_units (buf, r_num_math (NULL, str));
printf ("%s\n", buf);
return R_TRUE;
}
if (flags & 2048) {
ut32 n = r_num_math (num, str);
RPrint *p = r_print_new ();
p->big_endian = 0; // TODO: honor endian here
r_mem_copyendian ((ut8*) &n, (ut8*) &n, 8, 0); // fix endian here
r_print_date_unix (p, (const ut8*)&n, sizeof (ut64));
r_print_free (p);
return R_TRUE;
}
if (flags & 16) {
int h = r_str_hash (str);
printf ("0x%x\n", h);
return R_TRUE;
}
#define KB (flags&32)
if (flags & 64) { out_mode = 'f';
} else if (KB) out_mode = 'I';
if (str[0]=='0' && str[1]=='x') {
out_mode = (KB)? '0': 'I';
} else if (str[0]=='b') {
out_mode = 'B';
str++;
} else if (str[0]=='F' && str[1]=='x') {
out_mode = 'F';
*str = '0';
} else if (str[0]=='B' && str[1]=='x') {
out_mode = 'B';
*str = '0';
} else if (str[0]=='O' && str[1]=='x') {
out_mode = 'O';
*str = '0';
} else if (str[strlen (str)-1]=='d') {
out_mode = 'I';
str[strlen (str)-1] = 'b';
//TODO: Move print into format_output
} else if (str[strlen(str)-1]=='f') {
ut8 *p = (ut8*)&f;
sscanf (str, "%f", &f);
printf ("Fx%02x%02x%02x%02x\n", p[0], p[1], p[2], p[3]);
return R_TRUE;
}
while ((p = strchr (str, ' '))) {
*p = 0;
format_output (out_mode, str);
str = p+1;
}
if (*str) format_output (out_mode, str);
return R_TRUE;
}
static int use_stdin () {
static char buf[STDIN_BUFFER_SIZE];
int l, sflag = (flags & 4);
for (l=0; l>=0; l++) {
int n = read (0, buf+l, sizeof (buf)-l);
if (n<1) break;
l+= n;
if (buf[l]==0) {
l--;
continue;
}
buf[n] = 0;
if (sflag && strlen (buf) < sizeof (buf)) // -S
buf[strlen (buf)] = '\0';
else buf[strlen (buf)-1] = '\0';
if (!rax (buf, l, 0)) break;
l = 0;
}
if(l>0)
rax (buf, l, 0);
return 0;
}
int main (int argc, char **argv) {
int i;
num = r_num_new (NULL, NULL);
if (argc == 1)
return use_stdin ();
for (i=1; i<argc; i++)
rax (argv[i], 0, (i+1)==argc);
return 0;
}
|