65
64
display_numeric (cob_field *f, FILE *fp)
66
const unsigned short digits = COB_FIELD_DIGITS (f);
67
const signed short scale = COB_FIELD_SCALE (f);
68
const int has_sign = COB_FIELD_HAVE_SIGN (f) ? 1 : 0;
71
+ ((scale < 0) ? scale : 0) /* subtract scale when negative */
74
/* minimal validation */
75
if (size >= COB_MEDIUM_MAX) {
76
fputs (_("(Not representable)"), fp);
80
/* conversion to internal USAGE DISPLAY with SIGN SEPERATE */
84
COB_ATTR_INIT (COB_TYPE_NUMERIC_DISPLAY, digits, COB_FIELD_SCALE (f), 0, NULL);
86
attr.flags = COB_FLAG_HAVE_SIGN | COB_FLAG_SIGN_SEPARATE;
87
if (COB_FIELD_SIGN_LEADING (f) ||
88
COB_FIELD_TYPE (f) != COB_TYPE_NUMERIC_DISPLAY) {
89
attr.flags |= COB_FLAG_SIGN_LEADING;
92
COB_FIELD_INIT (size, COB_TERM_BUFF, &attr);
97
/* output of data to viewport */
99
register unsigned char *q = COB_TERM_BUFF;
100
const unsigned char *end = q + size;
101
for ( ; q < end; ++q) {
102
if (putc (*q, fp) != *q) {
110
pretty_display_numeric (cob_field *f, FILE *fp)
68
112
unsigned short digits;
113
const signed short scale = COB_FIELD_SCALE (f);
114
const int has_sign = COB_FIELD_HAVE_SIGN (f) ? 1 : 0;
74
digits = COB_FIELD_DIGITS (f);
75
scale = COB_FIELD_SCALE (f);
76
size = digits + (COB_FIELD_HAVE_SIGN (f) ? 1 : 0);
77
if (size >= COB_MEDIUM_MAX) {
78
fputs (_("(Not representable)"), fp);
81
COB_ATTR_INIT (COB_TYPE_NUMERIC_DISPLAY, digits, scale, 0, NULL);
83
temp.data = COB_TERM_BUFF;
85
if (COB_FIELD_HAVE_SIGN (f)) {
86
attr.flags = COB_FLAG_HAVE_SIGN | COB_FLAG_SIGN_SEPARATE;
87
if (COB_FIELD_SIGN_LEADING (f) ||
88
COB_FIELD_TYPE (f) != COB_TYPE_NUMERIC_DISPLAY) {
89
attr.flags |= COB_FLAG_SIGN_LEADING;
94
for (i = 0; i < size; ++i) {
95
unsigned char chr = temp.data[i];
96
if (putc (chr, fp) != chr) {
103
pretty_display_numeric (cob_field *f, FILE *fp)
105
unsigned short digits = COB_FIELD_DIGITS (f);
106
const signed short scale = COB_FIELD_SCALE (f);
107
int size = digits + !!COB_FIELD_HAVE_SIGN (f) + !!scale;
108
116
/* Note: while we only need one pair, the double one works around a bug in
109
117
old GCC versions https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53119 */
110
118
cob_pic_symbol pic[6] = {{ 0 }};
119
cob_pic_symbol *p = pic;
121
digits = COB_FIELD_DIGITS (f);
122
if (scale == 0) { /* PIC 999 */
123
size = digits + has_sign;
124
} else if (scale < 0) { /* PIC P99 */
125
size = digits + has_sign;
127
if (digits < scale) {
128
digits = scale; /* PIC PP9*/
132
size = digits + has_sign + 1;
113
135
if (size > COB_MEDIUM_MAX) {
114
136
fputs (_("(Not representable)"), fp);
119
size = digits + !!COB_FIELD_HAVE_SIGN (f);
120
} else if (digits < scale) {
122
size = digits + !!COB_FIELD_HAVE_SIGN (f) + 1;
126
if (COB_FIELD_HAVE_SIGN (f)) {
127
141
if (COB_FIELD_SIGN_SEPARATE (f)
128
&& !COB_FIELD_SIGN_LEADING(f)) {
142
&& !COB_FIELD_SIGN_LEADING (f)) {
163
177
p->symbol = '\0';
166
unsigned char *q = COB_TERM_BUFF;
167
const unsigned char *end = q + size;
173
COB_ATTR_INIT (COB_TYPE_NUMERIC_EDITED, digits, scale, 0,
174
(const cob_pic_symbol*)pic);
178
const int chr = *q++;
179
if (chr == 0 /* pretty-display stops here */
180
|| putc (chr, fp) != chr) {
180
/* conversion to internal USAGE DISPLAY EDITED */
184
COB_FIELD_INIT (size, COB_TERM_BUFF, &attr);
185
COB_ATTR_INIT (COB_TYPE_NUMERIC_EDITED, digits, scale, 0,
186
(const cob_pic_symbol*)pic);
188
cob_move (f, &field);
191
/* output of data to viewport */
193
register unsigned char *q = COB_TERM_BUFF;
194
const unsigned char *end = q + size;
195
for ( ; q < end; ++q) {
196
if (*q == 0 /* pretty-display stops here */
197
|| putc (*q, fp) != *q) {
218
if (strcmp(wrk,"-NAN") == 0
219
|| strcmp(wrk,"-NaNQ") == 0
220
|| strcmp(wrk,"-NaN") == 0
221
|| strcmp(wrk,"NAN") == 0
222
|| strcmp(wrk,"NaNQ") == 0) {
236
if (strcmp (wrk,"-NAN") == 0
237
|| strcmp (wrk,"-NaNQ") == 0
238
|| strcmp (wrk,"-NaN") == 0
239
|| strcmp (wrk,"NAN") == 0
240
|| strcmp (wrk,"NaNQ") == 0) {
228
246
cob_display_common (const cob_field *f, FILE *fp)
232
248
if (f->size == 0) {
282
298
fprintf (fp, "%x%x", *p >> 4, *p & 0xF);
285
} else if (COB_FIELD_TYPE(f) == COB_TYPE_NUMERIC_COMP5) {
286
cob_print_realbin (f, fp, f->attr->digits);
288
} else if (COB_FIELD_REAL_BINARY(f)
289
|| (COB_FIELD_TYPE(f) == COB_TYPE_NUMERIC_BINARY
290
&& !COB_MODULE_PTR->flag_pretty_display)) {
291
cob_print_realbin (f, fp, bin_digits[f->size]);
293
} else if (COB_FIELD_IS_NUMERIC (f)) {
302
if (COB_FIELD_IS_NUMERIC (f)) {
303
/* CHECKME: consider to check for pretty-printing first */
304
if (COB_FIELD_TYPE (f) == COB_TYPE_NUMERIC_COMP5) {
305
cob_print_realbin (f, fp, f->attr->digits);
308
if ( COB_FIELD_REAL_BINARY (f)
309
|| (COB_FIELD_TYPE(f) == COB_TYPE_NUMERIC_BINARY
310
&& !COB_MODULE_PTR->flag_pretty_display)) {
311
cob_print_realbin (f, fp, bin_digits[f->size]);
294
314
if (COB_MODULE_PTR->flag_pretty_display) {
295
315
pretty_display_numeric ((cob_field *)f, fp);
297
display_numeric ((cob_field *)f, fp);
318
display_numeric ((cob_field *)f, fp);
301
321
display_alnum (f, fp);