OpenCOBOL 1.1pre-rel
|
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include "move.h"
#include "coblocal.h"
#include "byteswap.h"
Go to the source code of this file.
static long long cob_binary_mget_int64 | ( | const cob_field *const | f | ) | [static] |
Definition at line 130 of file move.c.
{ long long n = 0; size_t fsiz = 8 - f->size; /* Experimental code - not activated */ #if 0 unsigned char *s; if ((COB_FIELD_BINARY_SWAP (f) && !COB_FIELD_HAVE_SIGN (f)) || (!COB_FIELD_BINARY_SWAP (f) && COB_FIELD_HAVE_SIGN (f))) { s = (unsigned char *)&n + fsiz; } else { s = (unsigned char *)&n; } own_byte_memcpy (s, f->data, f->size); if (COB_FIELD_BINARY_SWAP (f)) { n = COB_BSWAP_64 (n); } if (COB_FIELD_HAVE_SIGN (f)) { n >>= 8 * fsiz; /* shift with sign */ } #endif #ifndef WORDS_BIGENDIAN if (COB_FIELD_BINARY_SWAP (f)) { if (COB_FIELD_HAVE_SIGN (f)) { own_byte_memcpy ((unsigned char *)&n, f->data, f->size); n = COB_BSWAP_64 (n); n >>= 8 * fsiz; /* shift with sign */ } else { own_byte_memcpy (((unsigned char *)&n) + fsiz, f->data, f->size); n = COB_BSWAP_64 (n); } } else { if (COB_FIELD_HAVE_SIGN (f)) { own_byte_memcpy (((unsigned char *)&n) + fsiz, f->data, f->size); n >>= 8 * fsiz; /* shift with sign */ } else { own_byte_memcpy ((unsigned char *)&n, f->data, f->size); } } #else /* WORDS_BIGENDIAN */ if (COB_FIELD_HAVE_SIGN (f)) { own_byte_memcpy ((unsigned char *)&n, f->data, f->size); n >>= 8 * fsiz; /* shift with sign */ } else { own_byte_memcpy (((unsigned char *)&n) + fsiz, f->data, f->size); } #endif /* WORDS_BIGENDIAN */ return n; }
static void cob_binary_mset_int64 | ( | cob_field * | f, |
long long | n | ||
) | [static] |
Definition at line 183 of file move.c.
{ #ifndef WORDS_BIGENDIAN unsigned char *s; if (COB_FIELD_BINARY_SWAP (f)) { n = COB_BSWAP_64 (n); s = ((unsigned char *)&n) + 8 - f->size; } else { s = (unsigned char *)&n; } own_byte_memcpy (f->data, s, f->size); #else /* WORDS_BIGENDIAN */ own_byte_memcpy (f->data, ((unsigned char *)&n) + 8 - f->size, f->size); #endif /* WORDS_BIGENDIAN */ }
static int cob_display_get_int | ( | cob_field * | f | ) | [static] |
Definition at line 1213 of file move.c.
{ unsigned char *data; size_t size; size_t i; int val = 0; int sign; size = COB_FIELD_SIZE (f); data = COB_FIELD_DATA (f); sign = cob_get_sign (f); /* skip preceding zeros */ for (i = 0; i < size; ++i) { if (cob_d2i (data[i]) != 0) { break; } } /* get value */ if (COB_FIELD_SCALE(f) < 0) { for (; i < size; ++i) { val = val * 10 + cob_d2i (data[i]); } val *= cob_exp10[(int)-COB_FIELD_SCALE(f)]; } else { size -= COB_FIELD_SCALE(f); for (; i < size; ++i) { val = val * 10 + cob_d2i (data[i]); } } if (sign < 0) { val = -val; } cob_put_sign (f, sign); return val; }
static long long cob_display_get_long_long | ( | cob_field * | f | ) | [static] |
Definition at line 1252 of file move.c.
{ unsigned char *data; size_t size; size_t i; long long val = 0; int sign; size = COB_FIELD_SIZE (f); data = COB_FIELD_DATA (f); sign = cob_get_sign (f); /* skip preceding zeros */ for (i = 0; i < size; ++i) { if (cob_d2i (data[i]) != 0) { break; } } /* get value */ if (COB_FIELD_SCALE(f) < 0) { for (; i < size; ++i) { val = val * 10 + cob_d2i (data[i]); } val *= cob_exp10LL[(int)-COB_FIELD_SCALE(f)]; } else { size -= COB_FIELD_SCALE(f); for (; i < size; ++i) { val = val * 10 + cob_d2i (data[i]); } } if (sign < 0) { val = -val; } cob_put_sign (f, sign); return val; }
int cob_get_int | ( | cob_field * | f | ) |
Definition at line 1304 of file move.c.
{ int n; cob_field temp; cob_field_attr attr; switch (COB_FIELD_TYPE (f)) { case COB_TYPE_NUMERIC_DISPLAY: return cob_display_get_int (f); case COB_TYPE_NUMERIC_BINARY: return (int)cob_binary_mget_int64 (f); case COB_TYPE_NUMERIC_PACKED: return cob_packed_get_int (f); default: COB_ATTR_INIT (COB_TYPE_NUMERIC_BINARY, 9, 0, COB_FLAG_HAVE_SIGN, NULL); temp.size = 4; temp.data = (unsigned char *)&n; temp.attr = &attr; cob_move (f, &temp); return n; } }
long long cob_get_long_long | ( | cob_field * | f | ) |
Definition at line 1329 of file move.c.
{ long long n; cob_field temp; cob_field_attr attr; switch (COB_FIELD_TYPE (f)) { case COB_TYPE_NUMERIC_DISPLAY: return cob_display_get_long_long (f); case COB_TYPE_NUMERIC_BINARY: return cob_binary_mget_int64 (f); case COB_TYPE_NUMERIC_PACKED: return cob_packed_get_long_long (f); default: COB_ATTR_INIT (COB_TYPE_NUMERIC_BINARY, 18, 0, COB_FLAG_HAVE_SIGN, NULL); temp.size = 8; temp.data = (unsigned char *)&n; temp.attr = &attr; cob_move (f, &temp); return n; } }
void cob_init_move | ( | void | ) |
Definition at line 1354 of file move.c.
{ lastdata = cob_malloc (COB_SMALL_BUFF); lastsize = COB_SMALL_BUFF; }
static COB_INLINE int cob_max_int | ( | const int | x, |
const int | y | ||
) | [static] |
static COB_INLINE int cob_min_int | ( | const int | x, |
const int | y | ||
) | [static] |
Definition at line 1023 of file move.c.
{ if (COB_FIELD_TYPE (src) == COB_TYPE_ALPHANUMERIC_ALL) { cob_move_all (src, dst); return; } if (dst->size == 0) { return; } if (src->size == 0) { src = &cob_space; } /* non-elementary move */ if (COB_FIELD_TYPE (src) == COB_TYPE_GROUP || COB_FIELD_TYPE (dst) == COB_TYPE_GROUP) { cob_move_alphanum_to_alphanum (src, dst); return; } /* elementary move */ switch (COB_FIELD_TYPE (src)) { case COB_TYPE_NUMERIC_DISPLAY: switch (COB_FIELD_TYPE (dst)) { case COB_TYPE_NUMERIC_FLOAT: case COB_TYPE_NUMERIC_DOUBLE: cob_move_display_to_fp (src, dst); return; case COB_TYPE_NUMERIC_DISPLAY: cob_move_display_to_display (src, dst); return; case COB_TYPE_NUMERIC_PACKED: cob_move_display_to_packed (src, dst); return; case COB_TYPE_NUMERIC_BINARY: cob_move_display_to_binary (src, dst); return; case COB_TYPE_NUMERIC_EDITED: cob_move_display_to_edited (src, dst); return; case COB_TYPE_ALPHANUMERIC_EDITED: if (COB_FIELD_SCALE(src) < 0 || COB_FIELD_SCALE(src) > COB_FIELD_DIGITS(src)) { /* expand P's */ indirect_move (cob_move_display_to_display, src, dst, (size_t)cob_max_int ((int)COB_FIELD_DIGITS(src), (int)COB_FIELD_SCALE(src)), cob_max_int (0, (int)COB_FIELD_SCALE(src))); return; } else { cob_move_alphanum_to_edited (src, dst); return; } default: cob_move_display_to_alphanum (src, dst); return; } case COB_TYPE_NUMERIC_PACKED: switch (COB_FIELD_TYPE (dst)) { case COB_TYPE_NUMERIC_DISPLAY: cob_move_packed_to_display (src, dst); return; default: indirect_move (cob_move_packed_to_display, src, dst, COB_FIELD_DIGITS(src), COB_FIELD_SCALE(src)); return; } case COB_TYPE_NUMERIC_BINARY: switch (COB_FIELD_TYPE (dst)) { case COB_TYPE_NUMERIC_DISPLAY: cob_move_binary_to_display (src, dst); return; case COB_TYPE_NUMERIC_BINARY: case COB_TYPE_NUMERIC_PACKED: case COB_TYPE_NUMERIC_EDITED: case COB_TYPE_NUMERIC_FLOAT: case COB_TYPE_NUMERIC_DOUBLE: indirect_move (cob_move_binary_to_display, src, dst, 20, COB_FIELD_SCALE(src)); return; default: indirect_move (cob_move_binary_to_display, src, dst, COB_FIELD_DIGITS(src), COB_FIELD_SCALE(src)); return; } case COB_TYPE_NUMERIC_EDITED: switch (COB_FIELD_TYPE (dst)) { case COB_TYPE_NUMERIC_DISPLAY: cob_move_edited_to_display (src, dst); return; case COB_TYPE_NUMERIC_PACKED: case COB_TYPE_NUMERIC_BINARY: case COB_TYPE_NUMERIC_EDITED: case COB_TYPE_NUMERIC_FLOAT: case COB_TYPE_NUMERIC_DOUBLE: indirect_move (cob_move_edited_to_display, src, dst, 36, 18); return; case COB_TYPE_ALPHANUMERIC_EDITED: cob_move_alphanum_to_edited (src, dst); return; default: cob_move_alphanum_to_alphanum (src, dst); return; } case COB_TYPE_NUMERIC_FLOAT: case COB_TYPE_NUMERIC_DOUBLE: indirect_move (cob_move_fp_to_display, src, dst, 40, 20); return; default: switch (COB_FIELD_TYPE (dst)) { case COB_TYPE_NUMERIC_DISPLAY: cob_move_alphanum_to_display (src, dst); return; case COB_TYPE_NUMERIC_PACKED: case COB_TYPE_NUMERIC_BINARY: case COB_TYPE_NUMERIC_EDITED: case COB_TYPE_NUMERIC_FLOAT: case COB_TYPE_NUMERIC_DOUBLE: indirect_move (cob_move_alphanum_to_display, src, dst, 36, 18); return; case COB_TYPE_ALPHANUMERIC_EDITED: cob_move_alphanum_to_edited (src, dst); return; default: cob_move_alphanum_to_alphanum (src, dst); return; } } }
Definition at line 981 of file move.c.
{ size_t i; size_t digcount; cob_field temp; cob_field_attr attr; COB_ATTR_INIT (COB_TYPE_ALPHANUMERIC, 0, 0, 0, NULL); if (COB_FIELD_IS_NUMERIC(dst)) { digcount = 18; attr.type = COB_TYPE_NUMERIC_DISPLAY; attr.digits = 18; /* if (COB_FIELD_TYPE(dst) & COB_TYPE_NUMERIC_EDITED) { digcount = dst->size; } else { digcount = COB_FIELD_DIGITS(dst); } */ } else { digcount = dst->size; } if (digcount > lastsize) { free (lastdata); lastdata = cob_malloc (digcount); lastsize = digcount; } temp.size = digcount; temp.data = lastdata; temp.attr = &attr; if (likely(src->size == 1)) { memset (lastdata, src->data[0], digcount); } else { for (i = 0; i < digcount; ++i) { lastdata[i] = src->data[i % src->size]; } } cob_move (&temp, dst); }
Definition at line 331 of file move.c.
{ unsigned char *data1; unsigned char *data2; size_t size1; size_t size2; data1 = f1->data; size1 = f1->size; data2 = f2->data; size2 = f2->size; if (size1 >= size2) { /* move string with truncation */ if (COB_FIELD_JUSTIFIED (f2)) { memcpy (data2, data1 + size1 - size2, size2); } else { memcpy (data2, data1, size2); } } else { /* move string with padding */ if (COB_FIELD_JUSTIFIED (f2)) { memset (data2, ' ', size2 - size1); memcpy (data2 + size2 - size1, data1, size1); } else { memcpy (data2, data1, size1); memset (data2 + size1, ' ', size2 - size1); } } }
Definition at line 205 of file move.c.
{ unsigned char *p; unsigned char *s1; unsigned char *s2; unsigned char *e1; unsigned char *e2; int sign, count, size; unsigned char c; /* initialize */ s1 = f1->data; e1 = s1 + f1->size; s2 = COB_FIELD_DATA (f2); e2 = s2 + COB_FIELD_SIZE (f2); memset (f2->data, '0', f2->size); /* skip white spaces */ for (; s1 < e1; ++s1) { if (!isspace (*s1)) { break; } } /* check for sign */ sign = 0; if (s1 != e1) { if (*s1 == '+' || *s1 == '-') { sign = (*s1++ == '+') ? 1 : -1; } } /* count the number of digits before decimal point */ count = 0; for (p = s1; p < e1 && *p != cob_current_module->decimal_point; ++p) { if (isdigit (*p)) { ++count; } } /* find the start position */ size = (int) COB_FIELD_SIZE (f2) - COB_FIELD_SCALE(f2); if (count < size) { s2 += size - count; } else { while (count-- > size) { while (!isdigit (*s1++)) { ; } } } /* move */ count = 0; for (; s1 < e1 && s2 < e2; ++s1) { c = *s1; if (isdigit (c)) { *s2++ = c; } else if (c == cob_current_module->decimal_point) { if (count++ > 0) { goto error; } } else if (!(isspace (c) || c == cob_current_module->numeric_separator)) { goto error; } } cob_put_sign (f2, sign); return; error: memset (f2->data, '0', f2->size); cob_put_sign (f2, 0); }
Definition at line 922 of file move.c.
{ const char *p; unsigned char *max, *src, *dst; int sign = cob_get_sign (f1); int n; unsigned char c; src = COB_FIELD_DATA (f1); max = src + COB_FIELD_SIZE (f1); dst = f2->data; for (p = COB_FIELD_PIC (f2); *p;) { c = *p++; /* PIC char */ memcpy ((unsigned char *)&n, p, sizeof(int)); /* PIC char count */ p += sizeof(int); for (; n > 0; --n) { switch (c) { case 'A': case 'X': case '9': *dst++ = (src < max) ? *src++ : ' '; break; case '0': case '/': *dst++ = c; break; case 'B': *dst++ = ' '; break; default: *dst++ = '?'; /* invalid PIC */ } } } cob_put_sign (f1, sign); }
Definition at line 571 of file move.c.
{ int i, sign; unsigned long long val; long long val2; char buff[64]; /* long long is at most 20 digits */ sign = 1; /* get value */ if (COB_FIELD_HAVE_SIGN (f1)) { val2 = cob_binary_mget_int64 (f1); if (val2 < 0) { sign = -1; val = -val2; } else { val = val2; } } else { val = cob_binary_mget_int64 (f1); } /* convert to string */ i = 20; while (val > 0) { buff[--i] = (char) cob_i2d (val % 10); val /= 10; } /* store */ store_common_region (f2, (ucharptr)buff + i, (size_t)(20 - i), COB_FIELD_SCALE(f1)); cob_put_sign (f2, sign); }
Definition at line 294 of file move.c.
{ unsigned char *data1; unsigned char *data2; size_t size1; size_t size2; int sign; int diff; int zero_size; data1 = COB_FIELD_DATA (f1); size1 = COB_FIELD_SIZE (f1); sign = cob_get_sign (f1); data2 = f2->data; size2 = f2->size; if (size1 >= size2) { memcpy (data2, data1, size2); } else { diff = (int)(size2 - size1); zero_size = 0; /* move */ memcpy (data2, data1, size1); /* implied 0 ('P's) */ if (COB_FIELD_SCALE(f1) < 0) { zero_size = cob_min_int ((int)-COB_FIELD_SCALE(f1), diff); memset (data2 + size1, '0', (size_t)zero_size); } /* padding */ if (diff - zero_size > 0) { memset (data2 + size1 + zero_size, ' ', (size_t)(diff - zero_size)); } } cob_put_sign (f1, sign); }
Definition at line 536 of file move.c.
{ unsigned char *data1; size_t i, size; size_t size1; long long val = 0; int sign; size1 = COB_FIELD_SIZE (f1); data1 = COB_FIELD_DATA (f1); sign = cob_get_sign (f1); /* get value */ size = size1 - COB_FIELD_SCALE(f1) + COB_FIELD_SCALE(f2); for (i = 0; i < size; ++i) { if (i < size1) { val = val * 10 + cob_d2i (data1[i]); } else { val = val * 10; } } if (sign < 0 && COB_FIELD_HAVE_SIGN (f2)) { val = -val; } if (cob_current_module->flag_binary_truncate && !COB_FIELD_REAL_BINARY(f2)) { val %= cob_exp10LL[(int)COB_FIELD_DIGITS(f2)]; } /* store */ cob_binary_mset_int64 (f2, val); cob_put_sign (f1, sign); }
Definition at line 281 of file move.c.
{ int sign; sign = cob_get_sign (f1); store_common_region (f2, COB_FIELD_DATA (f1), COB_FIELD_SIZE (f1), COB_FIELD_SCALE (f1)); cob_put_sign (f1, sign); cob_put_sign (f2, sign); }
Definition at line 611 of file move.c.
{ const char *p; unsigned char *min, *max, *src, *dst, *end; unsigned char *decimal_point; int sign; int neg; int count = 0; int count_sign = 1; int count_curr = 1; int trailing_sign = 0; int trailing_curr = 0; int is_zero = 1; int suppress_zero = 1; int sign_first = 0; int p_is_left = 0; int repeat; int n; unsigned char pad = ' '; unsigned char x; unsigned char c; unsigned char sign_symbol = 0; unsigned char curr_symbol = 0; decimal_point = NULL; sign = cob_get_sign (f1); neg = (sign < 0) ? 1 : 0; /* count the number of digit places before decimal point */ for (p = COB_FIELD_PIC (f2); *p; p += 5) { c = p[0]; memcpy ((unsigned char *)&repeat, p + 1, sizeof(int)); if (c == '9' || c == 'Z' || c == '*') { count += repeat; count_sign = 0; count_curr = 0; } else if (count_curr && c == cob_current_module->currency_symbol) { count += repeat; } else if (count_sign && (c == '+' || c == '-')) { count += repeat; } else if (c == 'P') { if (count == 0) { p_is_left = 1; break; } else { count += repeat; count_sign = 0; count_curr = 0; } } else if (c == 'V' || c == cob_current_module->decimal_point) { break; } } min = COB_FIELD_DATA (f1); max = min + COB_FIELD_SIZE (f1); src = max - COB_FIELD_SCALE(f1) - count; dst = f2->data; end = f2->data + f2->size; for (p = COB_FIELD_PIC (f2); *p;) { c = *p++; /* PIC char */ memcpy ((unsigned char *)&n, p, sizeof(int)); /* PIC char count */ p += sizeof(int); for (; n > 0; n--, ++dst) { switch (c) { case '0': case '/': *dst = c; break; case 'B': *dst = suppress_zero ? pad : 'B'; break; case 'P': if (p_is_left) { ++src; --dst; } break; case '9': *dst = (min <= src && src < max) ? *src++ : (src++, '0'); if (*dst != '0') { is_zero = suppress_zero = 0; } suppress_zero = 0; trailing_sign = 1; trailing_curr = 1; break; case 'V': --dst; decimal_point = dst; break; case '.': case ',': if (c == cob_current_module->decimal_point) { *dst = cob_current_module->decimal_point; decimal_point = dst; } else { *dst = suppress_zero ? pad : c; } break; case 'C': case 'D': end = dst; memcpy (dst++, neg ? (c == 'C' ? "CR" : "DB") : " ", 2); break; case 'Z': case '*': x = (min <= src && src < max) ? *src++ : (src++, '0'); if (x != '0') { is_zero = suppress_zero = 0; } pad = (c == '*') ? '*' : ' '; *dst = suppress_zero ? pad : x; trailing_sign = 1; trailing_curr = 1; break; case '+': case '-': x = (min <= src && src < max) ? *src++ : (src++, '0'); if (x != '0') { is_zero = suppress_zero = 0; } if (trailing_sign) { *dst = neg ? '-' : (c == '+') ? '+' : ' '; --end; } else if (dst == f2->data || suppress_zero) { *dst = pad; sign_symbol = neg ? '-' : (c == '+') ? '+' : ' '; if (!curr_symbol) { ++sign_first; } } else { *dst = x; } break; default: if (c == cob_current_module->currency_symbol) { x = (min <= src && src < max) ? *src++ : (src++, '0'); if (x != '0') { is_zero = suppress_zero = 0; } if (trailing_curr) { *dst = cob_current_module->currency_symbol; --end; } else if (dst == f2->data || suppress_zero) { *dst = pad; curr_symbol = cob_current_module->currency_symbol; } else { *dst = x; } break; } *dst = '?'; /* invalid PIC */ } } } if (suppress_zero || (is_zero && COB_FIELD_BLANK_ZERO (f2))) { /* all digits are zeros */ if (pad == ' ' || COB_FIELD_BLANK_ZERO (f2)) { memset (f2->data, ' ', f2->size); } else { for (dst = f2->data; dst < f2->data + f2->size; ++dst) { if (*dst != cob_current_module->decimal_point) { *dst = pad; } } } } else { /* put zero after the decimal point if necessary */ if (decimal_point) { for (dst = decimal_point + 1; dst < end; ++dst) { if (!isdigit (*dst) && !strchr (",+-/B", *dst)) { *dst = '0'; } } } /* put sign or currency symbol at the beginning */ if (sign_symbol || curr_symbol) { for (dst = end - 1; dst > f2->data; --dst) { if (*dst == ' ') { break; } } if (sign_symbol && curr_symbol) { if (sign_first) { *dst = curr_symbol; --dst; if (dst >= f2->data) { *dst = sign_symbol; } } else { *dst = sign_symbol; --dst; if (dst >= f2->data) { *dst = curr_symbol; } } } else if (sign_symbol) { *dst = sign_symbol; } else { *dst = curr_symbol; } } /* replace all 'B's by pad */ count = 0; for (dst = f2->data; dst < end; ++dst) { if (*dst == 'B') { if (count == 0) { *dst = pad; } else { *dst = ' '; } } else { ++count; } } } cob_put_sign (f1, sign); }
Definition at line 448 of file move.c.
{ double val; size_t size; int sign = cob_get_sign (f1); size_t size1 = COB_FIELD_SIZE (f1); char *data1; char buff2[64]; memset ((ucharptr)buff2, 0, sizeof (buff2)); size = size1 - COB_FIELD_SCALE(f1); if (sign < 0) { buff2[0] = '-'; data1 = &buff2[1]; } else { data1 = buff2; } if (COB_FIELD_SCALE(f1) <= 0) { snprintf (data1, 63, "%*.*s.0", (int)size, (int)size, f1->data); } else { snprintf (data1, 63, "%*.*s.%*.*s", (int)size, (int)size, f1->data, COB_FIELD_SCALE(f1), COB_FIELD_SCALE(f1), f1->data + size); } sscanf (buff2, "%lf", &val); if (COB_FIELD_TYPE (f2) == COB_TYPE_NUMERIC_FLOAT) { float flval = (float) val; memcpy (f2->data, (ucharptr)&flval, sizeof(float)); } else { memcpy (f2->data, (ucharptr)&val, sizeof(double)); } }
Definition at line 366 of file move.c.
{ unsigned char *data1; unsigned char *data2; unsigned char *p; size_t digits1; size_t digits2; size_t i; size_t offset; int sign; int scale1; int scale2; unsigned char n; sign = cob_get_sign (f1); data1 = COB_FIELD_DATA (f1); digits1 = COB_FIELD_DIGITS (f1); scale1 = COB_FIELD_SCALE (f1); data2 = f2->data; digits2 = COB_FIELD_DIGITS (f2); scale2 = COB_FIELD_SCALE (f2); /* pack string */ memset (f2->data, 0, f2->size); offset = 1 - (digits2 % 2); p = data1 + (digits1 - scale1) - (digits2 - scale2); for (i = offset; i < digits2 + offset; ++i, ++p) { if (*p == ' ') { n = 0; } else { n = (data1 <= p && p < data1 + digits1) ? cob_d2i (*p) : 0; } if (i % 2 == 0) { data2[i / 2] = n << 4; } else { data2[i / 2] |= n; } } cob_put_sign (f1, sign); p = f2->data + f2->size - 1; if (!COB_FIELD_HAVE_SIGN (f2)) { *p = (*p & 0xf0) | 0x0f; } else if (sign < 0) { *p = (*p & 0xf0) | 0x0d; } else { *p = (*p & 0xf0) | 0x0c; } }
Definition at line 845 of file move.c.
{ unsigned char *p; const char *p1; size_t i; int sign = 0; int scale = 0; int count = 0; int have_point = 0; int cp; int n; unsigned char c; unsigned char buff[64]; p = buff; /* de-edit */ for (i = 0; i < f1->size; ++i) { cp = f1->data[i]; switch (cp) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': *p++ = cp; if (have_point) { ++scale; } break; case '.': case ',': if (cp == cob_current_module->decimal_point) { have_point = 1; } break; case '-': case 'C': sign = -1; break; } } /* count the number of digit places after decimal point in case of 'V', 'P' */ if (scale == 0) { for (p1 = COB_FIELD_PIC (f1); *p1; p1 += 5) { c = p1[0]; memcpy ((unsigned char *)&n, p1 + 1, sizeof(int)); if (c == '9' || c == '0' || c == 'Z' || c == '*') { if (have_point) { scale += n; } else { count += n; } } else if (c == 'P') { if (count == 0) { have_point = 1; scale += n; } else { scale -= n; } } else if (c == 'V') { have_point = 1; } } } /* store */ store_common_region (f2, buff, (size_t)(p - buff), scale); cob_put_sign (f2, sign); }
Definition at line 482 of file move.c.
{ double val; double frac; double intgr; int sign; int decs; long long res; char *x, *y; char buff[64]; char buff2[64]; memset ((ucharptr)buff, 0, sizeof (buff)); memset ((ucharptr)buff2, 0, sizeof (buff2)); if (COB_FIELD_TYPE (f1) == COB_TYPE_NUMERIC_FLOAT) { float flval; memcpy ((ucharptr)&flval, f1->data, sizeof (float)); val = flval; } else { memcpy ((ucharptr)&val, f1->data, sizeof (double)); } sign = 1; if (val < 0) { sign = -1; val = -val; } frac = modf (val, &intgr); res = (long long) intgr; decs = 0; for (; res; res /= 10) { ++decs; } snprintf (buff2, 63, "%-18.*lf", 18 - decs, val); y = buff; for (x = buff2; *x; ++x) { if (*x == '.') { continue; } if (*x == ' ') { continue; } *y++ = *x; } store_common_region (f2, (ucharptr)buff, strlen (buff), 18 - decs); cob_put_sign (f2, sign); }
Definition at line 417 of file move.c.
{ unsigned char *data; size_t i; size_t offset; int sign; unsigned char buff[64]; /* unpack string */ data = f1->data; sign = cob_get_sign (f1); offset = 1 - (COB_FIELD_DIGITS(f1) % 2); for (i = offset; i < COB_FIELD_DIGITS(f1) + offset; ++i) { if (i % 2 == 0) { buff[i - offset] = cob_i2d (data[i / 2] >> 4); } else { buff[i - offset] = cob_i2d (data[i / 2] & 0x0f); } } /* store */ store_common_region (f2, buff, COB_FIELD_DIGITS (f1), COB_FIELD_SCALE (f1)); cob_put_sign (f2, sign); }
static int cob_packed_get_int | ( | cob_field * | f1 | ) | [static] |
Definition at line 1161 of file move.c.
{ unsigned char *data; size_t i; size_t offset; int val = 0; int sign; data = f1->data; sign = cob_get_sign (f1); offset = 1 - (COB_FIELD_DIGITS(f1) % 2); for (i = offset; i < COB_FIELD_DIGITS(f1) - COB_FIELD_SCALE(f1) + offset; ++i) { val *= 10; if (i % 2 == 0) { val += data[i / 2] >> 4; } else { val += data[i / 2] & 0x0f; } } if (sign < 0) { val = -val; } return val; }
static long long cob_packed_get_long_long | ( | cob_field * | f1 | ) | [static] |
Definition at line 1187 of file move.c.
{ unsigned char *data; size_t i; size_t offset; long long val = 0; int sign; data = f1->data; sign = cob_get_sign (f1); offset = 1 - (COB_FIELD_DIGITS(f1) % 2); for (i = offset; i < COB_FIELD_DIGITS(f1) - COB_FIELD_SCALE(f1) + offset; ++i) { val *= 10; if (i % 2 == 0) { val += data[i / 2] >> 4; } else { val += data[i / 2] & 0x0f; } } if (sign < 0) { val = -val; } return val; }
void cob_set_int | ( | cob_field * | f, |
int | n | ||
) |
Definition at line 1291 of file move.c.
{ cob_field temp; cob_field_attr attr; COB_ATTR_INIT (COB_TYPE_NUMERIC_BINARY, 9, 0, COB_FLAG_HAVE_SIGN, NULL); temp.size = 4; temp.data = (unsigned char *)&n; temp.attr = &attr; cob_move (&temp, f); }
static void indirect_move | ( | void(*)(cob_field *src, cob_field *dst) | func, |
cob_field * | src, | ||
cob_field * | dst, | ||
size_t | size, | ||
int | scale | ||
) | [static] |
Definition at line 964 of file move.c.
{ cob_field temp; cob_field_attr attr; unsigned char data[64]; COB_ATTR_INIT (COB_TYPE_NUMERIC_DISPLAY, size, scale, COB_FLAG_HAVE_SIGN, NULL); temp.size = size; temp.data = data; temp.attr = &attr; func (src, &temp); cob_move (&temp, dst); }
static COB_INLINE void own_byte_memcpy | ( | unsigned char * | s1, |
const unsigned char * | s2, | ||
size_t | size | ||
) | [static] |
static void store_common_region | ( | cob_field * | f, |
const unsigned char * | data, | ||
const size_t | size, | ||
const int | scale | ||
) | [static] |
Definition at line 98 of file move.c.
{ const unsigned char *p; unsigned char *q; size_t csize; size_t cinc; int lf1 = -scale; int lf2 = -COB_FIELD_SCALE (f); int hf1 = (int) size + lf1; int hf2 = (int) COB_FIELD_SIZE (f) + lf2; int lcf; int gcf; lcf = cob_max_int (lf1, lf2); gcf = cob_min_int (hf1, hf2); memset (COB_FIELD_DATA (f), '0', COB_FIELD_SIZE (f)); if (gcf > lcf) { csize = (size_t)(gcf - lcf); p = data + hf1 - gcf; q = COB_FIELD_DATA (f) + hf2 - gcf; for (cinc = 0; cinc < csize; ++cinc, ++p, ++q) { if (unlikely(*p == ' ')) { *q = (unsigned char)'0'; } else { *q = *p; } } } }
const int cob_exp10[10] [static] |
const long long cob_exp10LL[19] [static] |
{ 1LL, 10LL, 100LL, 1000LL, 10000LL, 100000LL, 1000000LL, 10000000LL, 100000000LL, 1000000000LL, 10000000000LL, 100000000000LL, 1000000000000LL, 10000000000000LL, 100000000000000LL, 1000000000000000LL, 10000000000000000LL, 100000000000000000LL, 1000000000000000000LL }