mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-17 01:11:45 +00:00
dstring.[ch]:
create dsprintf and dvsprintf to do formated prints to dynamic strings. rest Use the new functions :)
This commit is contained in:
parent
f945907cff
commit
5a2538faaf
9 changed files with 89 additions and 83 deletions
|
@ -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
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue