This is stdio_sscanf.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_sscanf.c
*/
#include "stdio_internal.h"
/*
* macro used by _p_stdio_get_sscan_arg
*
* Prepare format 'fmt_ptr' to read 'str'. If 'fmt_ptr' is "%d %f" then
* the format string seen by sscanf() will be "%d%[^\1]". Then
* 'fmt_ptr' will be " %f" and 'str' will be the result of the second
* argument. In other words the rest of the string after reading
* (in this case) an integer.
* line 2: make "%d %f", "%d"
* line 3: format = "%d[^\1]"
* line 6: make "124 2.50", " 2.50"
*
* This assumes we will never hit an ascii 1 (SOH) in the input string.
*/
#define FMT_TAIL "%[^\1]"
#define sscan_arg(ARG) \
{ \
char __ch = *(++cPtr); \
*cPtr = '\0'; \
sprintf(scratch_fmt, "%s%s", fmt_ptr, FMT_TAIL); \
*eof = sscanf(str, scratch_fmt, (ARG), scratch_str); \
*cPtr = __ch; \
strcpy (str, scratch_str); \
fmt_ptr = cPtr; \
}
/*
* _p_stdio_get_sscan_arg()
*
* Get one argument for scanf(). 'str' and 'fmt' will be modified by
* this call.
*/
void _p_stdio_get_sscan_arg(str, scratch_str, fmt, scratch_fmt, type, i, f,
sbuf, eof)
char_t *str, *scratch_str;
struct s_fmt *fmt;
char_t *scratch_fmt;
int_t *type, *i;
double_t *f;
char_t *sbuf;
int_t *eof;
{
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;
sscan_arg(&tmp_l);
*i = (int_t) tmp_l;
}
else
{
int tmp_i;
sscan_arg(&tmp_i);
*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;
sscan_arg(&tmp_d);
*f = (double_t) tmp_d;
}
else
{
float tmp_f;
sscan_arg(&tmp_f);
*f = (double_t) tmp_f;
}
printed++;
*type = SCAN_FLOAT;
break;
case 'c':
{
char c;
sscan_arg(&c);
*i = (int_t) c;
printed++;
*type = SCAN_CHAR;
break;
}
case 's':
sscan_arg(sbuf);
*i = strlen(sbuf) + 1;
*type = SCAN_STRING;
printed++;
break;
default:
break;
}
}
fmt->findex = fmt_ptr - fmt->string;
}
else
{
*eof = sscanf(str, fmt_ptr, NULL);
}
} /* _p_stdio_get_sscan_arg() */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.