Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
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;
}
Exemplo n.º 4
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;
	}
}
Exemplo n.º 5
0
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;
}
Exemplo n.º 6
0
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);
	}
}