case FC_PACKED:
default:
- snprintf(buf, buflen, "%s", sc_print(_pack(val, mul_1), value_size*4, SC_HEX));
+ snprintf(buf, buflen, "%s", sc_print(_pack(val, mul_1), value_size*4, SC_HEX, 0));
buf[buflen - 1] = '\0';
break;
}
#define fail_char(a, b, c, d) _fail_char((a), (b), (c), (d), __FILE__, __LINE__)
/* shortcut output for debugging */
-# define sc_print_hex(a) sc_print((a), 0, SC_HEX)
-# define sc_print_dec(a) sc_print((a), 0, SC_DEC)
-# define sc_print_oct(a) sc_print((a), 0, SC_OCT)
-# define sc_print_bin(a) sc_print((a), 0, SC_BIN)
+# define sc_print_hex(a) sc_print((a), 0, SC_HEX, 0)
+# define sc_print_dec(a) sc_print((a), 0, SC_DEC, 1)
+# define sc_print_oct(a) sc_print((a), 0, SC_OCT, 0)
+# define sc_print_bin(a) sc_print((a), 0, SC_BIN, 0)
#ifdef STRCALC_DEBUG_PRINTCOMP
# define DEBUGPRINTF_COMPUTATION(x) printf x
* convert to a string
* FIXME: Doesn't check buffer bounds
*/
-const char *sc_print(const void *value, unsigned bits, enum base_t base)
+const char *sc_print(const void *value, unsigned bits, enum base_t base, int signed_mode)
{
static const char big_digits[] = "0123456789ABCDEF";
static const char small_digits[] = "0123456789abcdef";
base_val = alloca(calc_buffer_size);
div1_res = alloca(calc_buffer_size);
div2_res = alloca(calc_buffer_size);
- rem_res = alloca(calc_buffer_size);
+ rem_res = alloca(calc_buffer_size);
pos = output_buffer + bit_pattern_size;
*(--pos) = '\0';
p = val;
sign = 0;
- if (base == SC_DEC) {
+ if (signed_mode && base == SC_DEC) {
/* check for negative values */
if (_bit(val, bits - 1)) {
_negate(val, div2_res);
/**
* Converts a tarval into a string.
*
- * @param val1 the value pointer
- * @param bits number of valid bits in this value
- * @param base output base
+ * @param val1 the value pointer
+ * @param bits number of valid bits in this value
+ * @param base output base
+ * @param signed_mode print it signed (only decimal mode supported
*/
-const char *sc_print(const void *val1, unsigned bits, enum base_t base);
+const char *sc_print(const void *val1, unsigned bits, enum base_t base, int signed_mode);
/** Initialize the strcalc module.
* Sets up internal data structures and constants
/* decimal string representation because hexadecimal output is
* interpreted unsigned by fc_val_from_str, so this is a HACK */
snprintf(buffer, 100, "%s",
- sc_print(src->value, get_mode_size_bits(src->mode), SC_DEC));
+ sc_print(src->value, get_mode_size_bits(src->mode), SC_DEC, mode_is_signed(src->mode)));
buffer[100 - 1] = '\0';
switch (get_mode_size_bits(m))
{
switch (mode_info->mode_output) {
case TVO_DECIMAL:
- str = sc_print(tv->value, get_mode_size_bits(tv->mode), SC_DEC);
+ str = sc_print(tv->value, get_mode_size_bits(tv->mode), SC_DEC, mode_is_signed(tv->mode));
break;
case TVO_OCTAL:
- str = sc_print(tv->value, get_mode_size_bits(tv->mode), SC_OCT);
+ str = sc_print(tv->value, get_mode_size_bits(tv->mode), SC_OCT, 0);
break;
case TVO_HEX:
case TVO_NATIVE:
default:
- str = sc_print(tv->value, get_mode_size_bits(tv->mode), SC_HEX);
+ str = sc_print(tv->value, get_mode_size_bits(tv->mode), SC_HEX, 0);
break;
}
return snprintf(buf, len, "%s%s%s", prefix, str, suffix);