Do not mark the transformed as visited. It makes no sense at all.
[libfirm] / ir / tv / strcalc.c
index 1a078eb..4e4472e 100644 (file)
@@ -1325,7 +1325,7 @@ const char *sc_print(const void *value, unsigned bits, enum base_t base, int sig
        static const char small_digits[] = "0123456789abcdef";
 
        char *base_val, *div1_res, *div2_res, *rem_res;
-       int counter, nibbles, i, sign;
+       int counter, nibbles, i, sign, mask;
        char x;
 
        const char *val = (const char *)value;
@@ -1365,7 +1365,8 @@ const char *sc_print(const void *value, unsigned bits, enum base_t base, int sig
 
                /* last nibble must be masked */
                if (bits & 3) {
-                       x = and_table[_val(val[++counter])][bits & 3];
+                       mask = zex_digit[bits & 3];
+                       x = and_table[_val(val[counter++])][mask];
                        *(--pos) = digits[_val(x)];
                }
 
@@ -1391,7 +1392,8 @@ const char *sc_print(const void *value, unsigned bits, enum base_t base, int sig
 
                /* last nibble must be masked */
                if (bits & 3) {
-                       x = and_table[_val(val[++counter])][bits & 3];
+                       mask = zex_digit[bits & 3];
+                       x = and_table[_val(val[counter++])][mask];
 
                        pos -= 4;
                        p = binary_table[_val(x)];
@@ -1430,9 +1432,9 @@ const char *sc_print(const void *value, unsigned bits, enum base_t base, int sig
 
                /* last nibble must be masked */
                if (bits & 3) {
+                       mask = zex_digit[bits & 3];
+                       div1_res[counter] = and_table[_val(p[counter])][mask];
                        ++counter;
-
-                       div1_res[counter] = and_table[_val(p[counter])][bits & 3];
                }
 
                m = div1_res;
@@ -1472,8 +1474,8 @@ void init_strcalc(int precision) {
                calc_buffer_size = (precision / 2);
                max_value_size   = (precision / 4);
 
-               calc_buffer   = xmalloc(calc_buffer_size+1 * sizeof(char));
-               output_buffer = xmalloc(bit_pattern_size+1 * sizeof(char));
+               calc_buffer   = XMALLOCN(char, calc_buffer_size + 1);
+               output_buffer = XMALLOCN(char, bit_pattern_size + 1);
 
                DEBUGPRINTF(("init strcalc: \n\tPRECISION: %d\n\tCALC_BUFFER_SIZE = %d\n\tMAX_VALUE_SIZE = %d\n\tbuffer pointer: %p\n", precision, calc_buffer_size, max_value_size, calc_buffer));
        }