void buffer_printf(DESCRIPTOR_DATA *d, char *fmt, ...)
{
    char buf[MAX_STRING_LENGTH*2];
    va_list args;

    va_start(args, fmt);
    vsprintf(buf, fmt, args);
    va_end(args);
}

void log_printf( sh_int log_type, char *fmt, ...)
{
    char buf[MAX_STRING_LENGTH*2];
    va_list args;

    va_start(args, fmt);
    vsprintf(buf, fmt, args);
    va_end(args);
	
    log_string_plus( buf, log_type, LEVEL_LOG );
}

void command( CHAR_DATA *ch, DO_FUN *command, char *fmt, ...)
{
    char buf[MAX_STRING_LENGTH*2];
    va_list args;

    va_start(args, fmt);
    vsprintf(buf, fmt, args);
    va_end(args);
	
    (command)( ch, buf);
}

void stralloc_printf( char **pointer, char *fmt, ...)
{
    char buf[MAX_STRING_LENGTH*2];
    va_list args;

    va_start(args, fmt);
    vsprintf(buf, fmt, args);
    va_end(args);
	
    if (*pointer)
     STRFREE(*pointer);
    *pointer = STRALLOC( buf);
    return;
}

void strdup_printf( char **pointer, char *fmt, ...)
{
    char buf[MAX_STRING_LENGTH*2];
    va_list args;

    va_start(args, fmt);
    vsprintf(buf, fmt, args);
    va_end(args);
	
    if (*pointer)
     DISPOSE(*pointer);
    *pointer = str_dup( buf);
    return;
}

/*
   Simple function to do away with the usage of buffers everywhere you want formatted data.
   An example usage:

     case 2: sprintf( buf, "What do you want on your tombstone, %s?", victname );
     	     do_say( ch, buf );
     	     break;
would become:
     case 2:
       do_say( ch, format( "What do you want on your tombstone, %s?", victname) );
       break;

Removing the sprintf call, and the need for the buf variable.

*/
char *format( char *fmt, ...)
{
  static char newstring[MAX_INPUT_LENGTH];
  char buf[MAX_STRING_LENGTH*2];	/* better safe than sorry */
  va_list args;

  newstring[0] = '\0';

  if (fmt[0] == '\0')
   return " ";

  va_start(args, fmt);
  vsprintf(buf, fmt, args);
  va_end(args);
	
  if (buf[0] == '\0')
   return " ";
  strcpy( newstring, buf);
  return newstring;
}