This is stdio_sprintf.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_sprintf.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".
*/
#define sprint_arg(c_type, pcn_type, cPtr, str, fmt, arg, status) \
{ \
char __ch = *(++cPtr); \
*cPtr = '\0'; \
sprintf(str, fmt, (c_type) *((pcn_type *)(arg))); \
status = strlen(str); \
*cPtr = __ch; \
fmt = cPtr; \
}
/*
* _p_stdio_sprint_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_sprint_arg(str, fmt, arg, arg_type, status, depth, chars_printed)
char_t *str;
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)
sprint_arg(long, int_t, cPtr, str, fmt_ptr,
&dummy_i, *status)
else
sprint_arg(int, int_t, cPtr, str, 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)
sprint_arg(unsigned long, u_int_t, cPtr, str, fmt_ptr,
&dummy_i, *status)
else
sprint_arg(unsigned int, u_int_t, cPtr, str, fmt_ptr,
&dummy_i, *status);
printed++;
break;
}
case 'f':
case 'e':
case 'E':
case 'g':
case 'G':
sprint_arg(double, double_t, cPtr, str, 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);
sprint_arg(int, char_t, cPtr, str, fmt_ptr, &dummy_c, *status);
printed++;
break;
}
case 's':
sprint_arg(char *, char_t *, cPtr, str, fmt_ptr, &arg,
*status);
printed++;
break;
case 't':
{
char *cPtr1 = cPtr - 1;
/* Null out the % */
while (*cPtr1 != '%') cPtr1--;
*cPtr1 = '\0';
sprintf(str, fmt_ptr);
/*
if (*chars_printed = *status = strlen(str))
*status = is_long ? PRINT_LTERM : PRINT_TERM;
*/
*chars_printed = strlen(str);
*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;
}
else
{
printf("WARNING: format string does not match arglist in sprintf\n");
*status = 0;
}
} /* _p_stdio_sprint_arg() */
void _p_stdio_sdump_fmt(str, fmt, status)
char_t *str;
struct s_fmt *fmt;
int_t *status;
{
sprintf(str, fmt->string + fmt->findex);
*status = strlen(str);
} /* _p_stdio_sdump_fmt() */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.