This is stdio_fprintf.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_fprintf.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 fprintf(). Then change the format string to
* look like " %f".
*/
#ifdef PCN_FPRINTF_HACK
#define print_arg(c_type, pcn_type, cPtr, fp, fmt, arg, status) \
{ \
char __ch = *(++cPtr); \
*cPtr = '\0'; \
status = fprintf(fp, fmt, (c_type) *((pcn_type *)(arg))); \
status = 1; \
*cPtr = __ch; \
fmt = cPtr; \
}
#else /* PCN_FPRINTF_HACK */
#define print_arg(c_type, pcn_type, cPtr, fp, fmt, arg, status) \
{ \
char __ch = *(++cPtr); \
*cPtr = '\0'; \
status = fprintf(fp, fmt, (c_type) *((pcn_type *)(arg))); \
*cPtr = __ch; \
fmt = cPtr; \
}
#endif /* PCN_FPRINTF_HACK */
/*
* _p_stdio_fprint_arg()
*
* Look for the '%' and the conversion character after it, in the 'fmt'
* If it is the same as the C then call fprintf(). Then change the
* format string to the location after the conversion character
*/
void _p_stdio_fprint_arg(fp, fmt, arg, arg_type, status, depth, chars_printed)
FILE **fp;
struct s_fmt *fmt;
char_t *arg;
int_t *arg_type;
int_t *status;
int_t *depth, *chars_printed; /* Used for term printing */
{
int is_long = 0;
int printed;
char *fmt_ptr = fmt->string + fmt->findex;
char *cPtr;
*depth = 0;
if ((cPtr = strchr(fmt_ptr, '%')) != NULL)
{
is_long = 0;
printed = 0;
while (!printed)
{
switch (*(++cPtr))
{
case '%':
if ((cPtr = strchr(++cPtr, '%')) == NULL)
printed++;
case 'l':
is_long = 1;
break;
case 'd':
case 'i':
{
int_t dummy_i;
if (*arg_type == ARG_TYPE_CHAR)
dummy_i = (int_t) *((char_t *) arg);
else
dummy_i = *((int_t *) arg);
if (is_long)
print_arg(long, int_t, cPtr, *fp, fmt_ptr,
&dummy_i, *status)
else
print_arg(int, int_t, cPtr, *fp, fmt_ptr,
&dummy_i, *status);
printed++;
break;
}
case 'o':
case 'u':
case 'x':
case 'X':
{
int_t dummy_i;
if (*arg_type == ARG_TYPE_CHAR)
dummy_i = (int_t) *((char_t *) arg);
else
dummy_i = *((int_t *) arg);
if (is_long)
print_arg(unsigned long, u_int_t, cPtr, *fp, fmt_ptr,
&dummy_i, *status)
else
print_arg(unsigned int, u_int_t, cPtr, *fp, fmt_ptr,
&dummy_i, *status);
printed++;
break;
}
case 'f':
case 'e':
case 'E':
case 'g':
case 'G':
print_arg(double, double_t, cPtr, *fp, fmt_ptr, arg, *status);
printed++;
break;
case 'c':
{
char_t dummy_c;
if (*arg_type == ARG_TYPE_CHAR)
dummy_c = *((char_t *) arg);
else
dummy_c = (char_t) *((int_t *) arg);
print_arg(int, char_t, cPtr, *fp, fmt_ptr, &dummy_c, *status);
printed++;
break;
}
case 's':
print_arg(char *, char_t *, cPtr, *fp, fmt_ptr, &arg, *status);
printed++;
break;
case 't':
{
char *cPtr1 = cPtr - 1;
/* Null out the % */
while (*cPtr1 != '%') cPtr1--;
*cPtr1 = '\0';
*chars_printed = *status = fprintf(*fp, fmt_ptr);
#ifdef PCN_FPRINTF_HACK
*chars_printed = *status = 1;
#endif /* PCN_FPRINTF_HACK */
if (*status != EOF)
*status = is_long ? PRINT_LTERM : PRINT_TERM;
fmt_ptr = cPtr+1;
printed++;
break;
}
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
*depth *= 10;
*depth += *cPtr - '0';
break;
default:
break;
}
}
fmt->findex = fmt_ptr - fmt->string;
}
} /* _p_stdio_fprint_arg() */
void _p_stdio_dump_fmt(fp, fmt, status)
FILE **fp;
struct s_fmt *fmt;
int_t *status;
{
*status = fprintf(*fp, fmt->string + fmt->findex);
#ifdef PCN_FPRINTF_HACK
*status = 1;
#endif /* PCN_FPRINTF_HACK */
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.