*** move.c.orig Fri Mar 17 18:25:19 2006 --- move.c.new Fri Mar 17 17:57:18 2006 *************** *** 458,463 **** --- 458,464 ---- int is_zero = 1; int suppress_zero = 1; int sign_first = 0; + int P_left = 0; unsigned char *decimal_point = NULL; unsigned char sign_symbol = 0; unsigned char curr_symbol = 0; *************** *** 470,476 **** if (c == '9' || c == 'P' || c == 'Z' || c == '*' || c == cob_current_module->currency_symbol) { */ ! if (c == '9' || c == 'P' || c == 'Z' || c == '*') { count += p[1]; count_sign = 0; count_curr = 0; --- 471,477 ---- if (c == '9' || c == 'P' || c == 'Z' || c == '*' || c == cob_current_module->currency_symbol) { */ ! if (c == '9' || c == 'Z' || c == '*') { count += p[1]; count_sign = 0; count_curr = 0; *************** *** 478,483 **** --- 479,496 ---- count += p[1]; } else if (count_sign && (c == '+' || c == '-')) { count += p[1]; + } else if ( c == 'P' ) { + if( count == 0 ) + { + P_left = 1; + break; + } + else + { + count += p[1]; + count_sign = 0; + count_curr = 0; + } } else if (p[0] == 'V' || p[0] == cob_current_module->decimal_point) { break; } *************** *** 502,507 **** --- 515,525 ---- *dst = suppress_zero ? pad : 'B'; break; case 'P': + if( P_left ) + { + --dst; + ++src; + } break; case '9': *************** *** 523,529 **** --- 541,550 ---- *dst = *p; p += 2; } else { + if (c == cob_current_module->decimal_point) *dst = cob_current_module->decimal_point; + else /* ignore 'V' */ + --dst; } decimal_point = dst; break; *************** *** 667,675 **** --- 688,698 ---- size_t i; int sign = 0; int scale = 0; + int count = 0; int have_point = 0; unsigned char buff[64]; unsigned char *p = buff; + const char *p1; /* de-edit */ for (i = 0; i < f1->size; i++) { *************** *** 704,709 **** --- 727,761 ---- } } + /* count the number of digit places after decimal point in case of 'V', 'P'*/ + if( scale == 0 ) + { + for (p1 = f1->attr->pic; *p1; p1 += 2) + { + unsigned char c = p1[0]; + if ( c == '9' || c == '0' || c == 'Z' || c == '*' ) + { + if( have_point ) + scale += p1[1]; + else + count += p1[1]; + } + else if( c == 'P' ) + { + if( count == 0 ) + { + have_point = 1; + scale += p1[1]; + } + else + scale -= p1[1]; + } + else if ( p1[0] == 'V' ) + have_point = 1; + } + } + + /* store */ store_common_region (f2, buff, p - buff, scale); *************** *** 808,814 **** temp.size = digcount; temp.data = data; temp.attr = &attr; ! #ifdef __GNUC__ if ( __builtin_expect ((src->size == 1), 1) ) { #else if ( src->size == 1 ) { --- 860,866 ---- temp.size = digcount; temp.data = data; temp.attr = &attr; ! #if defined (__GNUC__) && (__GNUC__ >= 3) if ( __builtin_expect ((src->size == 1), 1) ) { #else if ( src->size == 1 ) {