*** numeric.c.orig Sat Dec 15 04:29:10 2007 --- numeric.c Thu Jul 12 16:02:19 2012 *************** *** 483,489 **** } static void ! cob_add_packed (cob_field *f, int val) { int sign; unsigned char *p; --- 483,528 ---- } static void ! cob_complement_packed (cob_field *f) ! { ! unsigned char *p; ! int ndigs; ! int tval; ! int carry = 0; ! unsigned int msn; ! int emptydig; ! ! ndigs = COB_FIELD_DIGITS(f); ! msn = 1; ! emptydig = 1 - (COB_FIELD_DIGITS(f) % 2); ! ! p = f->data + ((ndigs + emptydig) / 2) - (1 - msn); ! while (ndigs--) { ! if (!msn) { ! tval = *p & 0x0f; ! } else { ! tval = (*p & 0xf0) >> 4; ! } ! tval += carry; ! if (tval > 0) { ! carry = 1; ! tval= 10 - tval; ! } else { ! carry = 0; ! } ! if (!msn) { ! *p = (*p & 0xf0) | tval; ! msn = 1; ! } else { ! *p = (*p & 0x0f) | (tval << 4); ! msn = 0; ! p--; ! } ! } ! } ! ! static void ! cob_add_packed (cob_field *f, int ival) { int sign; unsigned char *p; *************** *** 494,506 **** unsigned int subtr = 0; unsigned int zeroes = 0; unsigned int origdigs; ! ndigs = COB_FIELD_DIGITS(f) - COB_FIELD_SCALE(f); if (ndigs <= 0) { return; } sign = COB_FIELD_HAVE_SIGN (f) ? cob_packed_get_sign (f) : 0; ! msn = 1 - (COB_FIELD_SCALE(f) % 2); /* -x +v = -(x - v), -x -v = -(x + v) */ if (sign < 0) { --- 533,556 ---- unsigned int subtr = 0; unsigned int zeroes = 0; unsigned int origdigs; + int emptydig; + long long val; ! val = ival; ! ! ndigs = COB_FIELD_SCALE(f); ! while(ndigs > 0) { ! --ndigs; ! val *= 10; ! } ! ! ndigs = COB_FIELD_DIGITS(f); if (ndigs <= 0) { return; } sign = COB_FIELD_HAVE_SIGN (f) ? cob_packed_get_sign (f) : 0; ! msn = 1; ! emptydig = 1 - (COB_FIELD_DIGITS(f) % 2); /* -x +v = -(x - v), -x -v = -(x + v) */ if (sign < 0) { *************** *** 510,516 **** val = -val; subtr = 1; } ! p = f->data + (ndigs / 2) - (1 - msn); origdigs = ndigs; while (ndigs--) { if (!msn) { --- 560,566 ---- val = -val; subtr = 1; } ! p = f->data + ((ndigs + emptydig) / 2) - (1 - msn); origdigs = ndigs; while (ndigs--) { if (!msn) { *************** *** 556,561 **** --- 606,612 ---- if (origdigs == zeroes) { *p = (*p & 0xf0) | 0x0c; } else if (subtr && carry) { + cob_complement_packed (f); sign = -sign; if (sign < 0) { *p = (*p & 0xf0) | 0x0d; *************** *** 563,568 **** --- 614,621 ---- *p = (*p & 0xf0) | 0x0c; } } + } else if (subtr && carry) { + cob_complement_packed (f); } } *************** *** 907,913 **** */ static int ! display_add_int (unsigned char *data, const size_t size, unsigned int n) { unsigned char *sp = data + size; size_t carry = 0; --- 960,966 ---- */ static int ! display_add_int (unsigned char *data, const size_t size, long long n) { unsigned char *sp = data + size; size_t carry = 0; *************** *** 954,960 **** } static int ! display_sub_int (unsigned char *data, const size_t size, unsigned int n) { unsigned char *sp = data + size; size_t carry = 0; --- 1007,1013 ---- } static int ! display_sub_int (unsigned char *data, const size_t size, long long n) { unsigned char *sp = data + size; size_t carry = 0; *************** *** 992,998 **** } static int ! cob_display_add_int (cob_field *f, int n) { int sign; size_t osize; --- 1045,1051 ---- } static int ! cob_display_add_int (cob_field *f, int in) { int sign; size_t osize; *************** *** 1001,1013 **** --- 1054,1072 ---- size_t size = COB_FIELD_SIZE (f); int scale = COB_FIELD_SCALE (f); unsigned char tfield[64]; + long long n; + n = in; osize = size; own_memcpy (tfield, data, osize); sign = cob_get_sign (f); /* -x + n = -(x - n) */ if (sign < 0) { n = -n; + } + while(scale > 0) { + --scale; + n *= 10; } if (unlikely(scale < 0)) {