GnuCOBOL  2.0
A free COBOL compiler
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
termio.c File Reference
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <stdarg.h>
#include <errno.h>
#include <time.h>
#include "libcob.h"
#include "coblocal.h"
Include dependency graph for termio.c:

Macros

#define COB_LIB_EXPIMP
 

Functions

static void display_numeric (cob_field *f, FILE *fp)
 
static void pretty_display_numeric (cob_field *f, FILE *fp)
 
static void display_alnum (cob_field *f, FILE *fp)
 
static void display_common (cob_field *f, FILE *fp)
 
void cob_display (const int to_stderr, const int newline, const int varcnt,...)
 
void cob_accept (cob_field *f)
 
void cob_init_termio (cob_global *lptr)
 

Variables

static cob_globalcobglobptr
 
static const unsigned short bin_digits []
 
static const cob_field_attr const_alpha_attr
 

Macro Definition Documentation

#define COB_LIB_EXPIMP

Function Documentation

void cob_accept ( cob_field f)

References cob_field::attr, COB_EC_IMP_ACCEPT, cob_field_accept(), COB_FIELD_IS_NUMERIC, COB_FIELD_TYPE, COB_MEDIUM_MAX, COB_MODULE_PTR, cob_move(), __cob_global::cob_screen_initialized, COB_SCREEN_PROMPT, cob_set_exception(), cob_set_int(), COB_TERM_BUFF, COB_TYPE_NUMERIC_DISPLAY, const_alpha_attr, cob_field::data, NULL, p, cob_field::size, and unlikely.

283 {
284  unsigned char *p;
285  size_t size;
286  int ipchr;
287  cob_field temp;
288 
292  return;
293  }
294  if (COB_MODULE_PTR->crt_status) {
295  if (COB_FIELD_IS_NUMERIC (COB_MODULE_PTR->crt_status)) {
296  cob_set_int (COB_MODULE_PTR->crt_status, 0);
297  } else {
298  memset (COB_MODULE_PTR->crt_status->data, '0', (size_t)4);
299  }
300  }
301  /* extension: ACCEPT OMITTED */
302  if (unlikely(!f)) {
303  for (; ; ) {
304  ipchr = getchar ();
305  if (ipchr == '\n' || ipchr == EOF) {
306  break;
307  }
308  }
309  return;
310  }
311  p = COB_TERM_BUFF;
312  temp.data = p;
313  temp.attr = &const_alpha_attr;
314  size = 0;
315  /* Read a line */
316  for (; size < COB_MEDIUM_MAX; ) {
317  ipchr = getchar ();
318  if (unlikely(ipchr == EOF)) {
320  if (!size) {
321  size = 1;
322  p[0] = ' ';
323  p[1] = 0;
324  }
325  break;
326  } else if (ipchr == '\n') {
327  break;
328  }
329  p[size++] = (char) ipchr;
330  }
331  temp.size = size;
333  if (temp.size > f->size) {
334  temp.size = f->size;
335  }
336  }
337  cob_move (&temp, f);
338 }
void cob_display ( const int  to_stderr,
const int  newline,
const int  varcnt,
  ... 
)

References COB_DISP_TO_STDERR, cob_field_display(), COB_SCREEN_EMULATE_NL, __cob_global::cob_screen_initialized, cob_u32_t, display_common(), NULL, and unlikely.

238 {
239  FILE *fp;
240  cob_field *f;
241  int i;
242  int nlattr;
243  cob_u32_t disp_redirect;
244  va_list args;
245 
246  disp_redirect = 0;
247  if (to_stderr) {
248  fp = stderr;
249  } else {
250  fp = stdout;
252  if (!COB_DISP_TO_STDERR) {
253  disp_redirect = 1;
254  } else {
255  fp = stderr;
256  }
257  }
258  }
259 
260  nlattr = newline ? COB_SCREEN_EMULATE_NL : 0;
261  va_start (args, varcnt);
262  for (i = 0; i < varcnt; ++i) {
263  f = va_arg (args, cob_field *);
264  if (unlikely(disp_redirect)) {
266  NULL, nlattr);
267  } else {
268  display_common (f, fp);
269  }
270  }
271  va_end (args);
272 
273  if (newline && !disp_redirect) {
274  putc ('\n', fp);
275  fflush (fp);
276  }
277 }
void cob_init_termio ( cob_global lptr)

Referenced by cob_init().

342 {
343  cobglobptr = lptr;
344 }
static void display_alnum ( cob_field f,
FILE *  fp 
)
static

References cob_field::data, and cob_field::size.

Referenced by display_common().

157 {
158  size_t i;
159 
160  for (i = 0; i < f->size; ++i) {
161  putc (f->data[i], fp);
162  }
163 }
static void display_common ( cob_field f,
FILE *  fp 
)
static

References cob_field::attr, bin_digits, COB_FIELD_IS_NUMERIC, COB_FIELD_IS_POINTER, COB_FIELD_REAL_BINARY, COB_FIELD_TYPE, COB_MODULE_PTR, cob_print_ieeedec(), cob_print_realbin(), COB_TYPE_NUMERIC_BINARY, COB_TYPE_NUMERIC_DOUBLE, COB_TYPE_NUMERIC_FLOAT, COB_TYPE_NUMERIC_FP_DEC128, COB_TYPE_NUMERIC_FP_DEC64, cob_field::data, cob_field_attr::digits, display_alnum(), display_numeric(), p, pretty_display_numeric(), and cob_field::size.

Referenced by cob_display().

167 {
168  unsigned char *p;
169  union {
170  double f1doub;
171  float f1float;
172  } un;
173  int n;
174 #if 0 /* RXWRXW - Print bin */
175  cob_field temp;
176  cob_field_attr attr;
177 #endif
178 
179  if (f->size == 0) {
180  return;
181  }
182  switch (COB_FIELD_TYPE (f)) {
184  memcpy (&un.f1doub, f->data, sizeof (double));
185  fprintf (fp, "%-.16G", un.f1doub);
186  return;
188  memcpy (&un.f1float, f->data, sizeof (float));
189  fprintf (fp, "%-.8G", (double)un.f1float);
190  return;
193  cob_print_ieeedec (f, fp);
194  return;
195  default:
196  break;
197  }
198  if (COB_FIELD_IS_POINTER (f)) {
199  fprintf (fp, "0x");
200 #ifdef WORDS_BIGENDIAN
201  p = f->data;
202  for (n = 0; n < sizeof(void *); ++n, ++p) {
203 #else
204  p = f->data + sizeof(void *) - 1;
205  for (n = sizeof(void *) - 1; n >= 0; --n, --p) {
206 #endif
207  fprintf (fp, "%x%x", *p >> 4, *p & 0xF);
208  }
209  return;
210  } else if (COB_FIELD_REAL_BINARY(f) ||
211  (COB_FIELD_TYPE(f) == COB_TYPE_NUMERIC_BINARY &&
212  !COB_MODULE_PTR->flag_pretty_display)) {
213  cob_print_realbin (f, fp, bin_digits[f->size]);
214  return;
215 #if 0 /* RXWRXW - print bin */
216  } else if (COB_FIELD_TYPE(f) == COB_TYPE_NUMERIC_BINARY &&
217  !COB_MODULE_PTR->flag_pretty_display) {
218  attr = *f->attr;
219  temp = *f;
220  attr.digits = bin_digits[f->size];
221  temp.attr = &attr;
222  display_numeric (&temp, fp);
223  return;
224 #endif
225  } else if (COB_FIELD_IS_NUMERIC (f)) {
226  if (COB_MODULE_PTR->flag_pretty_display) {
227  pretty_display_numeric (f, fp);
228  } else {
229  display_numeric (f, fp);
230  }
231  return;
232  }
233  display_alnum (f, fp);
234 }
static void display_numeric ( cob_field f,
FILE *  fp 
)
static

References _, cob_field::attr, COB_ATTR_INIT, COB_FIELD_DIGITS, COB_FIELD_HAVE_SIGN, COB_FIELD_SCALE, COB_FIELD_SIGN_LEADING, COB_FIELD_TYPE, COB_FLAG_HAVE_SIGN, COB_FLAG_SIGN_LEADING, COB_FLAG_SIGN_SEPARATE, COB_MEDIUM_MAX, cob_move(), COB_TERM_BUFF, COB_TYPE_NUMERIC_DISPLAY, cob_field::data, cob_field_attr::flags, NULL, and cob_field::size.

Referenced by display_common().

55 {
56  int i;
57  int digits;
58  int scale;
59  int size;
60  cob_field_attr attr;
61  cob_field temp;
62 
63  digits = COB_FIELD_DIGITS (f);
64  scale = COB_FIELD_SCALE (f);
65  size = digits + (COB_FIELD_HAVE_SIGN (f) ? 1 : 0);
66  if (size >= COB_MEDIUM_MAX) {
67  fputs (_("(Not representable)"), fp);
68  return;
69  }
70  COB_ATTR_INIT (COB_TYPE_NUMERIC_DISPLAY, digits, scale, 0, NULL);
71  temp.size = size;
72  temp.data = COB_TERM_BUFF;
73  temp.attr = &attr;
74  if (COB_FIELD_HAVE_SIGN (f)) {
76  if (COB_FIELD_SIGN_LEADING (f) ||
77  COB_FIELD_TYPE (f) != COB_TYPE_NUMERIC_DISPLAY) {
79  }
80  }
81 
82  cob_move (f, &temp);
83  for (i = 0; i < size; ++i) {
84  putc (temp.data[i], fp);
85  }
86 }
static void pretty_display_numeric ( cob_field f,
FILE *  fp 
)
static

References _, cob_field::attr, COB_ATTR_INIT, COB_FIELD_DIGITS, COB_FIELD_HAVE_SIGN, COB_FIELD_SCALE, COB_MEDIUM_MAX, COB_MODULE_PTR, cob_move(), COB_TERM_BUFF, COB_TYPE_NUMERIC_EDITED, cob_field::data, p, and cob_field::size.

Referenced by display_common().

90 {
91  unsigned char *p;
92  unsigned char *q;
93  int i;
94  int digits;
95  int scale;
96  int size;
97  cob_field_attr attr;
98  cob_field temp;
99  unsigned char pic[32];
100 
101  digits = COB_FIELD_DIGITS (f);
102  scale = COB_FIELD_SCALE (f);
103  size = (digits + (COB_FIELD_HAVE_SIGN (f) ? 1 : 0)
104  + (scale > 0 ? 1 : 0));
105  if (size > COB_MEDIUM_MAX) {
106  fputs (_("(Not representable)"), fp);
107  return;
108  }
109  q = COB_TERM_BUFF;
110  temp.size = size;
111  temp.data = q;
112  temp.attr = &attr;
113  COB_ATTR_INIT (COB_TYPE_NUMERIC_EDITED, digits, scale, 0,
114  (const char *)pic);
115  p = pic;
116 #if 0 /* RXWRXW - memset */
117  memset (pic, 0, sizeof (pic));
118  memset (q, 0, 256);
119 #endif
120  if (COB_FIELD_HAVE_SIGN (f)) {
121  *p++ = '+';
122  i = 1;
123  memcpy (p, (unsigned char *)&i, sizeof(int));
124  p += sizeof(int);
125  }
126  if (scale > 0) {
127  i = digits - scale;
128  if (i > 0 ) {
129  *p++ = '9';
130  memcpy (p, (unsigned char *)&i, sizeof(int));
131  p += sizeof(int);
132  }
133  *p++ = COB_MODULE_PTR->decimal_point;
134  i = 1;
135  memcpy (p, (unsigned char *)&i, sizeof(int));
136  p += sizeof(int);
137  *p++ = '9';
138  i = scale;
139  memcpy (p, (unsigned char *)&i, sizeof(int));
140  p += sizeof(int);
141  } else {
142  *p++ = '9';
143  i = digits;
144  memcpy (p, (unsigned char *)&i, sizeof(int));
145  p += sizeof(int);
146  }
147  *p = 0;
148 
149  cob_move (f, &temp);
150  for (i = 0; i < size; ++i) {
151  putc (q[i], fp);
152  }
153 }

Variable Documentation

const unsigned short bin_digits[]
static
Initial value:
=
{ 1, 3, 5, 8, 10, 13, 15, 17, 20 }

Referenced by display_common().

cob_global* cobglobptr
static
const cob_field_attr const_alpha_attr
static
Initial value:

Referenced by cob_accept().