hypre/src/utilities/printf.c
Ruipeng Li 612dcdb2eb
add fflush in hypre_printf (#505)
This PR adds `fflush` in `hypre_printf`.
2021-10-25 16:04:52 -07:00

236 lines
4.9 KiB
C

/******************************************************************************
* Copyright 1998-2019 Lawrence Livermore National Security, LLC and other
* HYPRE Project Developers. See the top-level COPYRIGHT file for details.
*
* SPDX-License-Identifier: (Apache-2.0 OR MIT)
******************************************************************************/
#include "_hypre_utilities.h"
#include <stdarg.h>
#include <stdio.h>
// #ifdef HYPRE_BIGINT
/* these prototypes are missing by default for some compilers */
/*
int vscanf( const char *format , va_list arg );
int vfscanf( FILE *stream , const char *format, va_list arg );
int vsscanf( const char *s , const char *format, va_list arg );
*/
HYPRE_Int
new_format( const char *format,
char **newformat_ptr )
{
const char *fp;
char *newformat, *nfp;
HYPRE_Int newformatlen;
HYPRE_Int copychar;
HYPRE_Int foundpercent = 0;
newformatlen = 2*strlen(format)+1; /* worst case is all %d's to %lld's */
newformat = hypre_TAlloc(char, newformatlen, HYPRE_MEMORY_HOST);
nfp = newformat;
for (fp = format; *fp != '\0'; fp++)
{
copychar = 1;
if (*fp == '%')
{
foundpercent = 1;
}
else if (foundpercent)
{
if (*fp == 'l')
{
fp++; /* remove 'l' and maybe add it back in switch statement */
if (*fp == 'l')
{
fp++; /* remove second 'l' if present */
}
}
switch(*fp)
{
case 'b': /* used for BigInt type in hypre */
#if defined(HYPRE_BIGINT) || defined(HYPRE_MIXEDINT)
*nfp = 'l'; nfp++;
*nfp = 'l'; nfp++;
#endif
*nfp = 'd'; nfp++; copychar = 0;
foundpercent = 0; break;
case 'd':
case 'i':
#if defined(HYPRE_BIGINT)
*nfp = 'l'; nfp++;
*nfp = 'l'; nfp++;
#endif
foundpercent = 0; break;
case 'f':
case 'e':
case 'E':
case 'g':
case 'G':
#if defined(HYPRE_SINGLE) /* no modifier */
#elif defined(HYPRE_LONG_DOUBLE) /* modify with 'L' */
*nfp = 'L'; nfp++;
#else /* modify with 'l' (default is _double_) */
*nfp = 'l'; nfp++;
#endif
foundpercent = 0; break;
case 'c':
case 'n':
case 'o':
case 'p':
case 's':
case 'u':
case 'x':
case 'X':
case '%':
foundpercent = 0; break;
}
}
if (copychar)
{
*nfp = *fp; nfp++;
}
}
*nfp = *fp;
*newformat_ptr = newformat;
/* printf("\nNEWFORMAT: %s\n", *newformat_ptr);*/
return 0;
}
HYPRE_Int
free_format( char *newformat )
{
hypre_TFree(newformat, HYPRE_MEMORY_HOST);
return 0;
}
HYPRE_Int
hypre_ndigits( HYPRE_BigInt number )
{
HYPRE_Int ndigits = 0;
while(number)
{
number /= 10;
ndigits++;
}
return ndigits;
}
/* printf functions */
HYPRE_Int
hypre_printf( const char *format, ...)
{
va_list ap;
char *newformat;
HYPRE_Int ierr = 0;
va_start(ap, format);
new_format(format, &newformat);
ierr = vprintf(newformat, ap);
free_format(newformat);
va_end(ap);
fflush(stdout);
return ierr;
}
HYPRE_Int
hypre_fprintf( FILE *stream, const char *format, ...)
{
va_list ap;
char *newformat;
HYPRE_Int ierr = 0;
va_start(ap, format);
new_format(format, &newformat);
ierr = vfprintf(stream, newformat, ap);
free_format(newformat);
va_end(ap);
return ierr;
}
HYPRE_Int
hypre_sprintf( char *s, const char *format, ...)
{
va_list ap;
char *newformat;
HYPRE_Int ierr = 0;
va_start(ap, format);
new_format(format, &newformat);
ierr = vsprintf(s, newformat, ap);
free_format(newformat);
va_end(ap);
return ierr;
}
/* scanf functions */
HYPRE_Int
hypre_scanf( const char *format, ...)
{
va_list ap;
char *newformat;
HYPRE_Int ierr = 0;
va_start(ap, format);
new_format(format, &newformat);
ierr = vscanf(newformat, ap);
free_format(newformat);
va_end(ap);
return ierr;
}
HYPRE_Int
hypre_fscanf( FILE *stream, const char *format, ...)
{
va_list ap;
char *newformat;
HYPRE_Int ierr = 0;
va_start(ap, format);
new_format(format, &newformat);
ierr = vfscanf(stream, newformat, ap);
free_format(newformat);
va_end(ap);
return ierr;
}
HYPRE_Int
hypre_sscanf( char *s, const char *format, ...)
{
va_list ap;
char *newformat;
HYPRE_Int ierr = 0;
va_start(ap, format);
new_format(format, &newformat);
ierr = vsscanf(s, newformat, ap);
free_format(newformat);
va_end(ap);
return ierr;
}
// #else
//
// /* this is used only to eliminate compiler warnings */
// HYPRE_Int hypre_printf_empty;
//
// #endif