static int cob_cmp_alnum (cob_field *f1, cob_field *f2) { const unsigned char *s; size_t min; int ret; int sign1; int sign2; sign1 = cob_get_sign (f1); sign2 = cob_get_sign (f2); min = (f1->size < f2->size) ? f1->size : f2->size; s = cob_current_module->collating_sequence; /* compare common substring */ if ((ret = common_cmps (f1->data, f2->data, min, s)) != 0) { goto end; } /* compare the rest (if any) with spaces */ if (f1->size > f2->size) { ret = common_cmpc (f1->data + min, ' ', f1->size - min); } else if (f1->size < f2->size) { ret = -common_cmpc (f2->data + min, ' ', f2->size - min); } end: if (COB_FIELD_TYPE (f1) != COB_TYPE_NUMERIC_PACKED) { cob_put_sign (f1, sign1); } if (COB_FIELD_TYPE (f2) != COB_TYPE_NUMERIC_PACKED) { cob_put_sign (f2, sign2); } return ret; }
int cob_is_numeric (cob_field *f) { unsigned char *data; size_t size; size_t i; int sign; switch (COB_FIELD_TYPE (f)) { case COB_TYPE_NUMERIC_BINARY: case COB_TYPE_NUMERIC_FLOAT: case COB_TYPE_NUMERIC_DOUBLE: return 1; case COB_TYPE_NUMERIC_PACKED: /* check digits */ for (i = 0; i < f->size - 1; ++i) { if ((f->data[i] & 0xf0) > 0x90 || (f->data[i] & 0x0f) > 0x09) { return 0; } } if ((f->data[i] & 0xf0) > 0x90) { return 0; } /* check sign */ sign = f->data[i] & 0x0f; if (sign == 0x0f) { return 1; } if (COB_FIELD_HAVE_SIGN (f)) { if (sign == 0x0c || sign == 0x0d) { return 1; } } return 0; case COB_TYPE_NUMERIC_DISPLAY: data = COB_FIELD_DATA (f); size = COB_FIELD_SIZE (f); sign = cob_get_sign (f); for (i = 0; i < size; ++i) { if (!isdigit (data[i])) { cob_put_sign (f, sign); return 0; } } cob_put_sign (f, sign); return 1; default: for (i = 0; i < f->size; ++i) { if (!isdigit (f->data[i])) { return 0; } } return 1; } }
static int cob_cmp_all (cob_field *f1, cob_field *f2) { unsigned char *data; const unsigned char *s; size_t size; int ret; int sign; size = f1->size; data = f1->data; sign = cob_get_sign (f1); ret = 0; s = cob_current_module->collating_sequence; while (size >= f2->size) { if ((ret = common_cmps (data, f2->data, f2->size, s)) != 0) { goto end; } size -= f2->size; data += f2->size; } if (size > 0) { ret = common_cmps (data, f2->data, size, s); } end: if (COB_FIELD_TYPE (f1) != COB_TYPE_NUMERIC_PACKED) { cob_put_sign (f1, sign); } return ret; }
static int cob_cmp_char (cob_field *f, const unsigned int c) { int sign; int ret; sign = cob_get_sign (f); ret = common_cmpc (f->data, c, f->size); if (COB_FIELD_TYPE (f) != COB_TYPE_NUMERIC_PACKED) { cob_put_sign (f, sign); } return ret; }
void cob_inspect_finish (void) { size_t i; if (inspect_replacing) { for (i = 0; i < inspect_size; i++) { if (inspect_mark[i] != -1) { inspect_data[i] = inspect_mark[i]; } } } cob_put_sign (inspect_var, inspect_sign); }