straprintf.cpp revision 9d577a7b721cf6430727d2bc2577642310642366
/* $Id$ */
/** @file
* IPRT - Allocating String Formatters.
*/
/*
* Copyright (C) 2006-2010 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*
* The contents of this file may alternatively be used under the terms
* of the Common Development and Distribution License Version 1.0
* (CDDL) only, as it comes in the "COPYING.CDDL" file of the
* VirtualBox OSE distribution, in which case the provisions of the
* CDDL are applicable instead of those of the GPL.
*
* You may elect to license modified versions of this file under the
* terms and conditions of either the GPL or the CDDL or both.
*/
/*******************************************************************************
* Header Files *
*******************************************************************************/
/*******************************************************************************
* Structures and Typedefs *
*******************************************************************************/
/** strallocoutput() argument structure. */
typedef struct STRALLOCARG
{
/** Pointer to current buffer position. */
char *psz;
/** Number of bytes left in the buffer - not including the trailing zero. */
/** Pointer to the start of the buffer. */
char *pszBuffer;
/** The number of bytes in the buffer. */
/** Set if the buffer was allocated using RTMemRealloc(). If clear
* pszBuffer points to the initial stack buffer. */
bool fAllocated;
/** Allocation tag used for statistics and such. */
const char *pszTag;
} STRALLOCARG;
/** Pointer to a strallocoutput() argument structure. */
typedef STRALLOCARG *PSTRALLOCARG;
/*******************************************************************************
* Internal Functions *
*******************************************************************************/
/**
* Output callback.
*
* @returns number of bytes written.
* @param pvArg Pointer to a STRBUFARG structure.
* @param pachChars Pointer to an array of utf-8 characters.
* @param cbChars Number of bytes in the character array pointed to by pachChars.
*/
{
{
/*
* The fast path
*/
{
if (cbChars)
{
}
return cbChars;
}
/*
* Need to (re)allocate the buffer.
*/
{
if (pszBuffer)
{
if (!pArg->fAllocated)
{
pArg->fAllocated = true;
}
if (cbChars)
{
}
return cbChars;
}
/* else allocation failure */
}
/* else wrap around */
/* failure */
}
return 0;
}
RTDECL(int) RTStrAPrintfVTag(char **ppszBuffer, const char *pszFormat, va_list args, const char *pszTag)
{
char szBuf[2048];
Arg.fAllocated = false;
szBuf[0] = '\0';
{
if (!Arg.fAllocated)
{
/* duplicate the string in szBuf */
if (psz)
*ppszBuffer = psz;
}
else
{
/* adjust the allocated buffer */
}
}
else
{
/* allocation error */
*ppszBuffer = NULL;
cbRet = -1;
/* free any allocated buffer */
if (Arg.fAllocated)
}
return cbRet;
}
{
char *pszBuffer;
return pszBuffer;
}