introduce tvprintf()
This commit is contained in:
parent
03f0ef778f
commit
80dd41451f
|
|
@ -3,11 +3,14 @@
|
||||||
* 1999 E. Rouat
|
* 1999 E. Rouat
|
||||||
************/
|
************/
|
||||||
|
|
||||||
|
#ifndef ngspice_STRINGUTIL_H
|
||||||
|
#define ngspice_STRINGUTIL_H
|
||||||
|
|
||||||
#include "ngspice/config.h"
|
#include "ngspice/config.h"
|
||||||
#include "ngspice/bool.h"
|
#include "ngspice/bool.h"
|
||||||
|
|
||||||
#ifndef ngspice_STRINGUTIL_H
|
#include <stdarg.h>
|
||||||
#define ngspice_STRINGUTIL_H
|
|
||||||
|
|
||||||
int prefix(register char *p, register char *s);
|
int prefix(register char *p, register char *s);
|
||||||
char * copy(const char *str);
|
char * copy(const char *str);
|
||||||
|
|
@ -24,6 +27,8 @@ char * gettok(char **s);
|
||||||
char * gettok_instance(char **);
|
char * gettok_instance(char **);
|
||||||
char * gettok_char(char **s, char p, bool inc_p, bool nested);
|
char * gettok_char(char **s, char p, bool inc_p, bool nested);
|
||||||
|
|
||||||
|
extern char *tvprintf(const char *fmt, va_list args);
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
extern char *tprintf(const char *fmt, ...) __attribute__ ((format (__printf__, 1, 2)));
|
extern char *tprintf(const char *fmt, ...) __attribute__ ((format (__printf__, 1, 2)));
|
||||||
#else
|
#else
|
||||||
|
|
|
||||||
|
|
@ -53,24 +53,21 @@ copy_substring(const char *str, const char *end)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
char*
|
char *
|
||||||
tprintf(const char *fmt, ...)
|
tvprintf(const char *fmt, va_list args)
|
||||||
{
|
{
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
char *p = buf;
|
char *p = buf;
|
||||||
int size = sizeof(buf);
|
int size = sizeof(buf);
|
||||||
|
|
||||||
va_list args;
|
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
|
||||||
int nchars;
|
int nchars;
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
va_start(args, fmt);
|
va_copy(ap, args);
|
||||||
|
nchars = vsnprintf(p, (size_t) size, fmt, ap);
|
||||||
nchars = vsnprintf(p, (size_t) size, fmt, args);
|
va_end(ap);
|
||||||
|
|
||||||
va_end(args);
|
|
||||||
|
|
||||||
if (nchars == -1) { // compatibility to old implementations
|
if (nchars == -1) { // compatibility to old implementations
|
||||||
size *= 2;
|
size *= 2;
|
||||||
|
|
@ -91,6 +88,20 @@ tprintf(const char *fmt, ...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char *
|
||||||
|
tprintf(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
char *rv;
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
rv = tvprintf(fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Determine whether sub is a substring of str. */
|
/* Determine whether sub is a substring of str. */
|
||||||
/* Like strstr( ) XXX */
|
/* Like strstr( ) XXX */
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue