#ifdef HAVE_ALLOCA_H
# include <alloca.h>
#endif
+#ifdef HAVE_MALLOC_H
+# include <malloc.h>
+#endif
#include <assert.h> /* assertions */
#include <string.h> /* memset/memcmp */
#include <stdio.h> /* output for error messages */
buffer[counter] = add2[0];
carry = add_table[_val(add1[1])][_val(add2[1])][0];
}
+ carry_flag = carry != SC_0;
}
static void _mul(const char *val1, const char *val2, char *buffer)
if (precision <= 0) precision = SC_DEFAULT_PRECISION;
/* round up to multiple of 4 */
- if (precision & 0x3) precision += 4 - (precision&0x3);
+ precision = (precision + 3) & ~3;
BIT_PATTERN_SIZE = (precision);
CALC_BUFFER_SIZE = (precision / 2);
MAX_VALUE_SIZE = (precision / 4);
- calc_buffer = malloc(CALC_BUFFER_SIZE+1 * sizeof(char));
+ calc_buffer = malloc(CALC_BUFFER_SIZE+1 * sizeof(char));
output_buffer = malloc(BIT_PATTERN_SIZE+1 * sizeof(char));
- if (calc_buffer == NULL || output_buffer == NULL)
- {
+ if (calc_buffer == NULL || output_buffer == NULL) {
assert(0 && "malloc failed");
exit(-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));
}
}
+
+
+void finish_strcalc() {
+ free(calc_buffer); calc_buffer = NULL;
+ free(output_buffer); output_buffer = NULL;
+}
+
int sc_get_precision(void)
{
return BIT_PATTERN_SIZE;