void cob_inspect_init (cob_field *var, const cob_u32_t replacing) { size_t i; size_t digcount; if (unlikely(COB_FIELD_IS_NUMDISP (var))) { inspect_var_copy = *var; inspect_var = &inspect_var_copy; inspect_sign = COB_GET_SIGN (var); } else { inspect_var = NULL; } inspect_size = COB_FIELD_SIZE (var); inspect_data = COB_FIELD_DATA (var); inspect_replacing = replacing; inspect_start = NULL; inspect_end = NULL; digcount = inspect_size * sizeof (int); if (digcount > inspect_mark_size) { if (inspect_mark) { free (inspect_mark); } inspect_mark = cob_fast_malloc (digcount); inspect_mark_size = digcount; } for (i = 0; i < inspect_size; ++i) { inspect_mark[i] = -1; } cob_set_exception (0); }
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; } }
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); } }