This is stdio_fscanf.c in view mode; [Download] [Up]
/* * PCN System * Author: Steve Tuecke * Argonne National Laboratory * * Please see the DISCLAIMER file in the top level directory of the * distribution regarding the provisions under which this software * is distributed. * * stdio_fscanf.c */ #include "stdio_internal.h" /* * If format string looks like "%d %f" this will * temporily change the format string to look like "%d". * Then call fscanf(). Then change the format string to * look like " %f". */ #define scan_arg(cPtr, fp, fmt, arg, eof) \ { \ char __ch = *(++cPtr); \ *cPtr = '\0'; \ (eof) = fscanf(fp, (fmt), (arg)); \ *cPtr = __ch; \ fmt = cPtr; \ } /* * _p_stdio_get_scan_arg() * * Get one argument for scanf() */ void _p_stdio_get_scan_arg(fp, fmt, type, i, f, sbuf, eof) FILE **fp; struct s_fmt *fmt; int_t *type, *i, *eof; char_t *sbuf; double_t *f; { int is_long = 0; int printed; char *cPtr; char *fmt_ptr = fmt->string + fmt->findex; *eof = 0; if ((cPtr = strchr(fmt_ptr, '%')) != NULL) { is_long = 0; printed = 0; while (!printed) { switch (*(++cPtr)) { case '%': if ((cPtr = strchr(++cPtr, '%')) == NULL) { *eof = EOF; printed++; } break; case '*': if ((cPtr = strchr(++cPtr, '%')) == NULL) { *eof = EOF; printed++; } break; case 'l': is_long = 1; break; case 'd': case 'i': case 'o': case 'u': case 'x': case 'X': if (is_long) { long tmp_l; scan_arg(cPtr, *fp, fmt_ptr, &tmp_l, *eof); *i = (int_t) tmp_l; } else { int tmp_i; scan_arg(cPtr, *fp, fmt_ptr, &tmp_i, *eof); *i = (int_t) tmp_i; } printed++; *type = SCAN_INT; break; case 'f': case 'e': case 'E': case 'g': case 'G': if (is_long) { double tmp_d; scan_arg(cPtr, *fp, fmt_ptr, &tmp_d, *eof); *f = (double_t) tmp_d; } else { float tmp_f; scan_arg(cPtr, *fp, fmt_ptr, &tmp_f, *eof); *f = (double_t) tmp_f; } printed++; *type = SCAN_FLOAT; break; case 'c': { char c; scan_arg(cPtr, *fp, fmt_ptr, &c, *eof); *i = (int_t) c; printed++; *type = SCAN_CHAR; break; } case 's': scan_arg(cPtr, *fp, fmt_ptr, sbuf, *eof); *i = strlen(sbuf) + 1; *type = SCAN_STRING; printed++; break; default: break; } } fmt->findex = fmt_ptr - fmt->string; } else { *eof = fscanf(*fp, fmt_ptr, NULL); } } /* _p_stdio_get_scan_arg() */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.