dstring.[ch]:

create dsprintf and dvsprintf to do formated prints to dynamic strings.
rest
	Use the new functions :)
This commit is contained in:
Bill Currie 2002-03-08 23:11:42 +00:00
parent f945907cff
commit 5a2538faaf
9 changed files with 89 additions and 83 deletions

View file

@ -29,6 +29,10 @@
#ifndef __dstring_h #ifndef __dstring_h
#define __dstring_h #define __dstring_h
#include <stdarg.h>
#include "QF/gcc_attr.h"
typedef struct dstring_s { typedef struct dstring_s {
unsigned long int size, truesize; unsigned long int size, truesize;
char *str; char *str;
@ -50,4 +54,8 @@ dstring_t *dstring_newstr (void);
void dstring_appendstr (dstring_t *dstr, const char *str); void dstring_appendstr (dstring_t *dstr, const char *str);
void dstring_insertstr (dstring_t *dstr, const char *str, unsigned int pos); void dstring_insertstr (dstring_t *dstr, const char *str, unsigned int pos);
void dstring_clearstr (dstring_t *dstr); void dstring_clearstr (dstring_t *dstr);
int dvsprintf (dstring_t *dstr, const char *fmt, va_list args);
int dsprintf (dstring_t *dstr, const char *fmt, ...) __attribute__((format(printf,2,3)));
#endif // __dstring_h #endif // __dstring_h

View file

@ -107,7 +107,7 @@ SNDDMA_Init (void)
} }
stereo = snd_stereo->int_val; stereo = snd_stereo->int_val;
if (!pcmname) if (!pcmname)
pcmname = "plug:0,0"; pcmname = "plughw:0,0";
if ((err = snd_pcm_open (&pcm, pcmname, if ((err = snd_pcm_open (&pcm, pcmname,
SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) {
Sys_Printf ("Error: audio open error: %s\n", snd_strerror (err)); Sys_Printf ("Error: audio open error: %s\n", snd_strerror (err));

View file

@ -411,31 +411,23 @@ void
C_Print (const char *fmt, va_list args) C_Print (const char *fmt, va_list args)
{ {
char *s; char *s;
static char *buffer; static dstring_t *buffer;
int mask, size, c, l, y; int mask, c, l, y;
static int buffer_size, cr; static int cr;
size = vsnprintf (buffer, buffer_size, fmt, args) + 1; // +1 for nul if (!buffer)
while (size <= 0 || size > buffer_size) { buffer = dstring_new ();
if (size > 0)
buffer_size = (size + 1023) & ~1023; // 1k multiples dvsprintf (buffer, fmt, args);
else
buffer_size += 1024;
buffer = realloc (buffer, buffer_size);
if (!buffer)
Sys_Error ("console: could not allocate %d bytes\n",
buffer_size);
size = vsnprintf (buffer, buffer_size, fmt, args) + 1;
}
// log all messages to file // log all messages to file
if (con_debuglog) if (con_debuglog)
Sys_DebugLog (va ("%s/qconsole.log", com_gamedir), "%s", buffer); Sys_DebugLog (va ("%s/qconsole.log", com_gamedir), "%s", buffer->str);
if (!con_initialized) if (!con_initialized)
return; return;
s = buffer; s = buffer->str;
if (s[0] == 1 || s[0] == 2) { if (s[0] == 1 || s[0] == 2) {
mask = 128; // go to colored text mask = 128; // go to colored text
@ -489,10 +481,10 @@ C_Print (const char *fmt, va_list args)
} }
// echo to debugging console // echo to debugging console
if ((byte)buffer[0] > 2) if ((byte)buffer->str[0] > 2)
fputs (buffer, stdout); fputs (buffer->str, stdout);
else if ((byte)buffer[0]) else if ((byte)buffer->str[0])
fputs (buffer + 1, stdout); fputs (buffer->str + 1, stdout);
} }
static void static void

View file

@ -299,30 +299,18 @@ C_Shutdown (void)
static void static void
C_Print (const char *fmt, va_list args) C_Print (const char *fmt, va_list args)
{ {
static unsigned char *buffer; static dstring_t *buffer;
unsigned char *txt; unsigned char *txt;
int size;
static int buffer_size;
size = vsnprintf (buffer, buffer_size, fmt, args) + 1; // +1 for nul if (!buffer)
//printf ("size = %d\n", size); buffer = dstring_new ();
while (size <= 0 || size > buffer_size) {
if (size > 0)
buffer_size = (size + 1023) & ~1023; // 1k multiples
else
buffer_size += 1024;
buffer = realloc (buffer, buffer_size);
if (!buffer)
Sys_Error ("console: could not allocate %d bytes\n",
buffer_size);
size = vsnprintf (buffer, buffer_size, fmt, args) + 1;
//printf ("size = %d\n", size);
}
txt = buffer; dvsprintf (buffer, fmt, args);
txt = buffer->str;
#ifdef HAVE_CURSES_H #ifdef HAVE_CURSES_H
if (use_curses) { if (use_curses) {
Con_BufferAddText (output_buffer, buffer); Con_BufferAddText (output_buffer, buffer->str);
while (*txt) while (*txt)
draw_fun_char (output, *txt++); draw_fun_char (output, *txt++);
wrefresh (output); wrefresh (output);

View file

@ -33,6 +33,8 @@ static const char rcsid[] =
#include "QF/sys.h" #include "QF/sys.h"
#include "QF/dstring.h" #include "QF/dstring.h"
#include "compat.h"
dstring_t * dstring_t *
dstring_new (void) dstring_new (void)
{ {
@ -135,3 +137,34 @@ dstring_clearstr (dstring_t *dstr)
dstring_adjust (dstr); dstring_adjust (dstr);
dstr->str[0] = 0; dstr->str[0] = 0;
} }
int
dvsprintf (dstring_t *dstr, const char *fmt, va_list args)
{
int size;
size = vsnprintf (dstr->str, dstr->truesize, fmt, args) + 1; // +1 for nul
while (size <= 0 || size > dstr->truesize) {
if (size > 0)
dstr->size = (size + 1023) & ~1023; // 1k multiples
else
dstr->size = dstr->truesize + 1024;
dstring_adjust (dstr);
size = vsnprintf (dstr->str, dstr->truesize, fmt, args) + 1;
}
dstr->size = size;
return size - 1;
}
int
dsprintf (dstring_t *dstr, const char *fmt, ...)
{
va_list args;
int ret;
va_start (args, fmt);
ret = dvsprintf (dstr, fmt, args);
va_end (args);
return ret;
}

View file

@ -58,6 +58,7 @@ static const char rcsid[] =
#include <stdarg.h> #include <stdarg.h>
#include <stdlib.h> #include <stdlib.h>
#include "QF/dstring.h"
#include "QF/vfile.h" #include "QF/vfile.h"
#include "QF/vfs.h" #include "QF/vfs.h"
@ -261,17 +262,15 @@ Qprintf (VFile *file, const char *fmt, ...)
ret = vfprintf (file->file, fmt, args); ret = vfprintf (file->file, fmt, args);
#ifdef HAVE_ZLIB #ifdef HAVE_ZLIB
else { else {
char buf[4096]; static dstring_t *buf;
if (!buf)
buf = dstring_new ();
va_start (args, fmt); va_start (args, fmt);
#ifdef HAVE_VSNPRINTF dvsprintf (buf, fmt, args);
(void) vsnprintf (buf, sizeof (buf), fmt, args);
#else
(void) vsprintf (buf, fmt, args);
#endif
va_end (args); va_end (args);
ret = strlen (buf); /* some *snprintf don't return the nb ret = strlen (buf->str);
of bytes written */
if (ret > 0) if (ret > 0)
ret = gzwrite (file->gzfile, buf, (unsigned) ret); ret = gzwrite (file->gzfile, buf, (unsigned) ret);
} }

View file

@ -60,6 +60,7 @@ static const char rcsid[] =
#include <sys/types.h> #include <sys/types.h>
#include "QF/cvar.h" #include "QF/cvar.h"
#include "QF/dstring.h"
#include "QF/sys.h" #include "QF/sys.h"
#include "compat.h" #include "compat.h"
@ -185,18 +186,21 @@ Sys_SetErrPrintf (sys_printf_t func)
void void
Sys_Print (FILE *stream, const char *fmt, va_list args) Sys_Print (FILE *stream, const char *fmt, va_list args)
{ {
char msg[MAXPRINTMSG]; static dstring_t *msg;
unsigned char *p; unsigned char *p;
vsnprintf (msg, sizeof (msg), fmt, args); if (!msg)
msg = dstring_new ();
dvsprintf (msg, fmt, args);
#ifdef WIN32 #ifdef WIN32
if (stream == stderr) if (stream == stderr)
MessageBox (NULL, msg, "Error", 0 /* MB_OK */ ); MessageBox (NULL, msg->str, "Error", 0 /* MB_OK */ );
#endif #endif
/* translate to ASCII instead of printing [xx] --KB */ /* translate to ASCII instead of printing [xx] --KB */
for (p = (unsigned char *) msg; *p; p++) for (p = (unsigned char *) msg->str; *p; p++)
putc (sys_char_map[*p], stream); putc (sys_char_map[*p], stream);
fflush (stream); fflush (stream);

View file

@ -34,6 +34,7 @@ static const char rcsid[] =
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include "QF/dstring.h"
#include "QF/qtypes.h" #include "QF/qtypes.h"
#include "QF/sys.h" #include "QF/sys.h"
#include "QF/va.h" #include "QF/va.h"
@ -47,30 +48,18 @@ static const char rcsid[] =
does a varargs printf into a temp buffer, so I don't need to have does a varargs printf into a temp buffer, so I don't need to have
varargs versions of all text functions. varargs versions of all text functions.
*/ */
char * char *
va (const char *fmt, ...) va (const char *fmt, ...)
{ {
va_list args; va_list args;
static char *string; static dstring_t *string;
int size;
static int string_size; if (!string)
string = dstring_new ();
va_start (args, fmt); va_start (args, fmt);
size = vsnprintf (string, string_size, fmt, args) + 1; // +1 for nul dvsprintf (string, fmt, args);
//printf ("size = %d\n", size);
while (size <= 0 || size > string_size) {
if (size > 0)
string_size = (size + 1023) & ~1023; // 1k multiples
else
string_size += 1024;
string = realloc (string, string_size);
if (!string)
Sys_Error ("console: could not allocate %d bytes\n",
string_size);
size = vsnprintf (string, string_size, fmt, args) + 1;
//printf ("size = %d\n", size);
}
va_end (args); va_end (args);
return string; return string->str;
} }

View file

@ -1025,14 +1025,10 @@ preprocess_file (const char *filename)
temp++; temp++;
if (*sourcedir) { if (*sourcedir) {
tempname->size = strlen (sourcedir) + 1 + strlen (temp) + 1; dsprintf (tempname, "%s%c%s", sourcedir,
dstring_adjust (tempname); PATH_SEPARATOR, temp);
sprintf (tempname->str, "%s%c%s", sourcedir,
PATH_SEPARATOR, temp);
} else { } else {
tempname->size = strlen (temp) + 2 + 1; dsprintf (tempname, "%s.p", temp);
dstring_adjust (tempname);
sprintf (tempname->str, "%s.p", temp);
} }
free (basename); free (basename);
} else { } else {
@ -1044,10 +1040,7 @@ preprocess_file (const char *filename)
} }
} }
tempname->size = strlen (temp1) + 1 dsprintf (tempname, "%s%c%sXXXXXX", temp1,
+ strlen (temp2 ? temp2 + 1 : this_program) + 1;
dstring_adjust (tempname);
sprintf (tempname->str, "%s%c%sXXXXXX", temp1,
PATH_SEPARATOR, temp2 ? temp2 + 1 : this_program); PATH_SEPARATOR, temp2 ? temp2 + 1 : this_program);
} }
build_cpp_args (filename, tempname->str); build_cpp_args (filename, tempname->str);