int cob_cmp (cob_field *f1, cob_field *f2) { cob_field temp; cob_field_attr attr; unsigned char buff[48]; if (COB_FIELD_IS_NUMERIC (f1) && COB_FIELD_IS_NUMERIC (f2)) { return cob_numeric_cmp (f1, f2); } if (COB_FIELD_TYPE (f2) == COB_TYPE_ALPHANUMERIC_ALL) { if (f2 == &cob_zero && COB_FIELD_IS_NUMERIC (f1)) { return cob_cmp_int (f1, 0); } else if (f2->size == 1) { return cob_cmp_char (f1, f2->data[0]); } else { return cob_cmp_all (f1, f2); } } else if (COB_FIELD_TYPE (f1) == COB_TYPE_ALPHANUMERIC_ALL) { if (f1 == &cob_zero && COB_FIELD_IS_NUMERIC (f2)) { return -cob_cmp_int (f2, 0); } else if (f1->size == 1) { return -cob_cmp_char (f2, f1->data[0]); } else { return -cob_cmp_all (f2, f1); } } else { if (COB_FIELD_IS_NUMERIC (f1) && COB_FIELD_TYPE (f1) != COB_TYPE_NUMERIC_DISPLAY) { temp.size = COB_FIELD_DIGITS(f1); temp.data = buff; temp.attr = &attr; attr = *f1->attr; attr.type = COB_TYPE_NUMERIC_DISPLAY; attr.flags &= ~COB_FLAG_HAVE_SIGN; cob_move (f1, &temp); f1 = &temp; } if (COB_FIELD_IS_NUMERIC (f2) && COB_FIELD_TYPE (f2) != COB_TYPE_NUMERIC_DISPLAY) { temp.size = COB_FIELD_DIGITS(f2); temp.data = buff; temp.attr = &attr; attr = *f2->attr; attr.type = COB_TYPE_NUMERIC_DISPLAY; attr.flags &= ~COB_FLAG_HAVE_SIGN; cob_move (f2, &temp); f2 = &temp; } return cob_cmp_alnum (f1, f2); } }
static void display_numeric (cob_field *f, FILE *fp) { int i; int digits; int scale; int size; cob_field_attr attr; cob_field temp; unsigned char data[128]; digits = COB_FIELD_DIGITS (f); scale = COB_FIELD_SCALE (f); size = digits + (COB_FIELD_HAVE_SIGN (f) ? 1 : 0); COB_ATTR_INIT (COB_TYPE_NUMERIC_DISPLAY, digits, scale, 0, NULL); temp.size = size; temp.data = data; temp.attr = &attr; if (COB_FIELD_HAVE_SIGN (f)) { attr.flags = COB_FLAG_HAVE_SIGN | COB_FLAG_SIGN_SEPARATE; if (COB_FIELD_SIGN_LEADING (f) || COB_FIELD_TYPE (f) == COB_TYPE_NUMERIC_BINARY) { attr.flags |= COB_FLAG_SIGN_LEADING; } } cob_move (f, &temp); for (i = 0; i < size; i++) { putc (data[i], fp); } }
static void pretty_display_numeric (cob_field *f, FILE *fp) { unsigned char *p; int i; int digits; int scale; int size; cob_field_attr attr; cob_field temp; unsigned char pic[64]; unsigned char data[256]; /* RXW if (COB_FIELD_TYPE(f) == COB_TYPE_NUMERIC_BINARY) { digits = bin_digits[f->size]; } else { */ digits = COB_FIELD_DIGITS (f); /* RXW } */ scale = COB_FIELD_SCALE (f); size = (digits + (COB_FIELD_HAVE_SIGN (f) ? 1 : 0) + (scale > 0 ? 1 : 0)); p = pic; temp.size = size; temp.data = data; temp.attr = &attr; COB_ATTR_INIT (COB_TYPE_NUMERIC_EDITED, digits, scale, 0, (char *)pic); memset (pic, 0, sizeof (pic)); memset (data, 0, sizeof (data)); if (COB_FIELD_HAVE_SIGN (f)) { *p++ = '+'; i = 1; memcpy (p, (unsigned char *)&i, sizeof(int)); p += sizeof(int); } if (scale > 0) { *p++ = '9'; i = digits - scale; memcpy (p, (unsigned char *)&i, sizeof(int)); p += sizeof(int); *p++ = cob_current_module->decimal_point; i = 1; memcpy (p, (unsigned char *)&i, sizeof(int)); p += sizeof(int); *p++ = '9'; i = scale; memcpy (p, (unsigned char *)&i, sizeof(int)); p += sizeof(int); } else { *p++ = '9'; i = digits; memcpy (p, (unsigned char *)&i, sizeof(int)); p += sizeof(int); } cob_move (f, &temp); for (i = 0; i < size; i++) { putc (data[i], fp); } }