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; }
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; }
void cob_inspect_init (cob_field *var, const int replacing) { size_t i; size_t digcount; inspect_var_copy = *var; inspect_var = &inspect_var_copy; inspect_replacing = replacing; inspect_sign = cob_get_sign (var); inspect_size = COB_FIELD_SIZE (var); inspect_data = COB_FIELD_DATA (var); inspect_start = NULL; inspect_end = NULL; digcount = inspect_size * sizeof (int); if (digcount > lastsize) { free (inspect_mark); inspect_mark = cob_malloc (digcount); lastsize = digcount; } for (i = 0; i < inspect_size; i++) { inspect_mark[i] = -1; } cob_exception_code = 0; }
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_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_before (const cob_field *str) { unsigned char *p; unsigned char *data; size_t size; int sign; char *buf = NULL; unsigned char *p2; unsigned int n; int fig; switch (COB_FIELD_TYPE (str)) { case COB_TYPE_NUMERIC_DISPLAY: data = COB_FIELD_DATA (str); size = COB_FIELD_SIZE (str); sign = cob_get_sign ((cob_field *)str); n = 0; fig = 0; while (size > 1 && *data == '0') { size--; data++; } while (size--) { n = n * 10 + cob_d2i (*data++); fig++; } buf = cob_malloc (fig); sprintf (buf, "%d", n); p2 = (unsigned char *)buf; break; default: fig = str->size; p2 = str->data; break; } for (p = inspect_start; p < inspect_end - fig + 1; p++) { if (memcmp (p, p2, fig) == 0) { inspect_end = p; break; } } if (buf) { free (buf); } }