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); } }
void cob_real_put_sign (cob_field *f, const int sign) { unsigned char *p; int c; switch (COB_FIELD_TYPE (f)) { case COB_TYPE_NUMERIC_DISPLAY: /* locate sign */ if (unlikely(COB_FIELD_SIGN_LEADING (f))) { p = f->data; } else { p = f->data + f->size - 1; } /* put sign */ if (unlikely(COB_FIELD_SIGN_SEPARATE (f))) { c = (sign < 0) ? '-' : '+'; if (*p != c) { *p = c; } } else if (unlikely(cob_current_module->display_sign)) { cob_put_sign_ebcdic (p, sign); } else if (sign < 0) { #ifdef COB_EBCDIC_MACHINE cob_put_sign_ascii (p); #else PUT_SIGN_ASCII (*p); #endif } return; case COB_TYPE_NUMERIC_PACKED: p = f->data + f->size - 1; if (sign < 0) { *p = (*p & 0xf0) | 0x0d; } else { *p = (*p & 0xf0) | 0x0c; } return; default: return; } }
int cob_real_get_sign (cob_field *f) { unsigned char *p; switch (COB_FIELD_TYPE (f)) { case COB_TYPE_NUMERIC_DISPLAY: /* locate sign */ if (unlikely(COB_FIELD_SIGN_LEADING (f))) { p = f->data; } else { p = f->data + f->size - 1; } /* get sign */ if (unlikely(COB_FIELD_SIGN_SEPARATE (f))) { return (*p == '+') ? 1 : -1; } else { if (*p >= '0' && *p <= '9') { return 1; } if (*p == ' ') { *p = (unsigned char)'0'; return 1; } if (unlikely(cob_current_module->display_sign)) { return cob_get_sign_ebcdic (p); } else { #ifdef COB_EBCDIC_MACHINE cob_get_sign_ascii (p); #else GET_SIGN_ASCII (*p); #endif return -1; } } case COB_TYPE_NUMERIC_PACKED: p = f->data + f->size - 1; return ((*p & 0x0f) == 0x0d) ? -1 : 1; default: return 0; } }