mirror of https://github.com/ipxe/ipxe.git
[efi] Add efi_asprintf() and efi_vasprintf()
Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/963/head
parent
c4a8d90387
commit
ce2200d5fb
|
@ -109,18 +109,14 @@ efi_image_path ( struct image *image, EFI_DEVICE_PATH_PROTOCOL *parent ) {
|
||||||
*/
|
*/
|
||||||
static wchar_t * efi_image_cmdline ( struct image *image ) {
|
static wchar_t * efi_image_cmdline ( struct image *image ) {
|
||||||
wchar_t *cmdline;
|
wchar_t *cmdline;
|
||||||
size_t len;
|
|
||||||
|
|
||||||
len = ( strlen ( image->name ) +
|
/* Allocate and construct command line */
|
||||||
( image->cmdline ?
|
if ( efi_asprintf ( &cmdline, "%s%s%s", image->name,
|
||||||
( 1 /* " " */ + strlen ( image->cmdline ) ) : 0 ) );
|
( image->cmdline ? " " : "" ),
|
||||||
cmdline = zalloc ( ( len + 1 /* NUL */ ) * sizeof ( wchar_t ) );
|
( image->cmdline ? image->cmdline : "" ) ) < 0 ) {
|
||||||
if ( ! cmdline )
|
|
||||||
return NULL;
|
return NULL;
|
||||||
efi_snprintf ( cmdline, ( len + 1 /* NUL */ ), "%s%s%s",
|
}
|
||||||
image->name,
|
|
||||||
( image->cmdline ? " " : "" ),
|
|
||||||
( image->cmdline ? image->cmdline : "" ) );
|
|
||||||
return cmdline;
|
return cmdline;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,8 @@ extern int efi_vssnprintf ( wchar_t *wbuf, ssize_t swsize, const char *fmt,
|
||||||
va_list args );
|
va_list args );
|
||||||
extern int efi_ssnprintf ( wchar_t *wbuf, ssize_t swsize,
|
extern int efi_ssnprintf ( wchar_t *wbuf, ssize_t swsize,
|
||||||
const char *fmt, ... );
|
const char *fmt, ... );
|
||||||
|
extern int efi_vasprintf ( wchar_t **strp, const char *fmt, va_list args );
|
||||||
|
extern int efi_asprintf ( wchar_t **strp, const char *fmt, ... );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write a formatted string to a wide-character buffer
|
* Write a formatted string to a wide-character buffer
|
||||||
|
|
|
@ -78,6 +78,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||||
#define ERRFILE_dma ( ERRFILE_CORE | 0x00260000 )
|
#define ERRFILE_dma ( ERRFILE_CORE | 0x00260000 )
|
||||||
#define ERRFILE_cachedhcp ( ERRFILE_CORE | 0x00270000 )
|
#define ERRFILE_cachedhcp ( ERRFILE_CORE | 0x00270000 )
|
||||||
#define ERRFILE_acpimac ( ERRFILE_CORE | 0x00280000 )
|
#define ERRFILE_acpimac ( ERRFILE_CORE | 0x00280000 )
|
||||||
|
#define ERRFILE_efi_strings ( ERRFILE_CORE | 0x00290000 )
|
||||||
|
|
||||||
#define ERRFILE_eisa ( ERRFILE_DRIVER | 0x00000000 )
|
#define ERRFILE_eisa ( ERRFILE_DRIVER | 0x00000000 )
|
||||||
#define ERRFILE_isa ( ERRFILE_DRIVER | 0x00010000 )
|
#define ERRFILE_isa ( ERRFILE_DRIVER | 0x00010000 )
|
||||||
|
|
|
@ -25,6 +25,8 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <errno.h>
|
||||||
#include <ipxe/vsprintf.h>
|
#include <ipxe/vsprintf.h>
|
||||||
#include <ipxe/efi/efi_strings.h>
|
#include <ipxe/efi/efi_strings.h>
|
||||||
|
|
||||||
|
@ -150,3 +152,45 @@ int efi_ssnprintf ( wchar_t *wbuf, ssize_t swsize, const char *fmt, ... ) {
|
||||||
va_end ( args );
|
va_end ( args );
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a formatted string to newly allocated memory
|
||||||
|
*
|
||||||
|
* @v wstrp Pointer to hold allocated string
|
||||||
|
* @v fmt Format string
|
||||||
|
* @v args Arguments corresponding to the format string
|
||||||
|
* @ret len Length of formatted string (in wide characters)
|
||||||
|
*/
|
||||||
|
int efi_vasprintf ( wchar_t **wstrp, const char *fmt, va_list args ) {
|
||||||
|
size_t len;
|
||||||
|
va_list args_tmp;
|
||||||
|
|
||||||
|
/* Calculate length needed for string */
|
||||||
|
va_copy ( args_tmp, args );
|
||||||
|
len = ( efi_vsnprintf ( NULL, 0, fmt, args_tmp ) + 1 );
|
||||||
|
va_end ( args_tmp );
|
||||||
|
|
||||||
|
/* Allocate and fill string */
|
||||||
|
*wstrp = malloc ( len * sizeof ( **wstrp ) );
|
||||||
|
if ( ! *wstrp )
|
||||||
|
return -ENOMEM;
|
||||||
|
return efi_vsnprintf ( *wstrp, len, fmt, args );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a formatted string to newly allocated memory
|
||||||
|
*
|
||||||
|
* @v wstrp Pointer to hold allocated string
|
||||||
|
* @v fmt Format string
|
||||||
|
* @v ... Arguments corresponding to the format string
|
||||||
|
* @ret len Length of formatted string (in wide characters)
|
||||||
|
*/
|
||||||
|
int efi_asprintf ( wchar_t **wstrp, const char *fmt, ... ) {
|
||||||
|
va_list args;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
va_start ( args, fmt );
|
||||||
|
len = efi_vasprintf ( wstrp, fmt, args );
|
||||||
|
va_end ( args );
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue