mirror of
https://git.busybox.net/uClibc
synced 2025-10-14 01:32:00 +08:00
libc/misc/gnu/obprintf.c: implement obstack_printf and obstack_vprintf
This adds a straight forward implementation for obstack_printf and obstack_vprintf on uClibc's already existing obstack_grow and vasprintf. It does not attempt to port over glibc's implementation in terms of _IO_* structs and functions. Signed-off-by: Anthony G. Basile <blueness@gentoo.org> Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
This commit is contained in:

committed by
Bernhard Reutner-Fischer

parent
f143f92069
commit
10d12e77d5
@@ -854,7 +854,7 @@ extern char *cuserid (char *__s);
|
||||
#endif /* Use X/Open, but not issue 6. */
|
||||
|
||||
|
||||
#if 0 /* def __USE_GNU uClibc note: not supported */
|
||||
#if defined __USE_GNU && defined __UCLIBC_HAS_OBSTACK__
|
||||
struct obstack; /* See <obstack.h>. */
|
||||
|
||||
/* Write formatted output to an obstack. */
|
||||
@@ -865,7 +865,7 @@ extern int obstack_vprintf (struct obstack *__restrict __obstack,
|
||||
const char *__restrict __format,
|
||||
__gnuc_va_list __args)
|
||||
__THROW __attribute__ ((__format__ (__printf__, 2, 0)));
|
||||
#endif /* Use GNU. */
|
||||
#endif /* USE_GNU && UCLIBC_HAS_OBSTACK. */
|
||||
|
||||
|
||||
#if defined __USE_POSIX || defined __USE_MISC
|
||||
|
@@ -7,7 +7,7 @@
|
||||
|
||||
subdirs += libc/misc/gnu
|
||||
|
||||
CSRC-$(UCLIBC_HAS_OBSTACK) := obstack.c
|
||||
CSRC-$(UCLIBC_HAS_OBSTACK) := obstack.c obprintf.c
|
||||
|
||||
MISC_GNU_DIR := $(top_srcdir)libc/misc/gnu
|
||||
MISC_GNU_OUT := $(top_builddir)libc/misc/gnu
|
||||
|
35
libc/misc/gnu/obprintf.c
Normal file
35
libc/misc/gnu/obprintf.c
Normal file
@@ -0,0 +1,35 @@
|
||||
/* Copyright (C) 2013 Gentoo Foundation
|
||||
* Licensed under LGPL v2.1 or later, see the file COPYING.LIB in this tarball.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#ifdef _LIBC
|
||||
# include <obstack.h>
|
||||
#else
|
||||
# include "obstack.h"
|
||||
#endif
|
||||
|
||||
int
|
||||
_obstack_vprintf (struct obstack *obstack, const char *format, va_list args)
|
||||
{
|
||||
int n;
|
||||
char *s;
|
||||
n = vasprintf(&s, format, args);
|
||||
obstack_grow(obstack, s, n);
|
||||
return n;
|
||||
}
|
||||
weak_alias (_obstack_vprintf, obstack_vprintf)
|
||||
|
||||
int
|
||||
_obstack_printf (struct obstack *obstack, const char *format, ...)
|
||||
{
|
||||
int n;
|
||||
va_list ap;
|
||||
va_start (ap, format);
|
||||
n = _obstack_vprintf (obstack, format, ap);
|
||||
va_end (ap);
|
||||
return n;
|
||||
}
|
||||
weak_alias (_obstack_printf, obstack_printf)
|
@@ -1,4 +1,8 @@
|
||||
/* Test case by Alexandre Duret-Lutz <duret_g@epita.fr>. */
|
||||
/* Test case by Alexandre Duret-Lutz <duret_g@epita.fr>.
|
||||
* test_obstack_printf() added by Anthony G. Basile <blueness.gentoo.org>.
|
||||
*/
|
||||
|
||||
#include <features.h>
|
||||
#include <obstack.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
@@ -26,7 +30,7 @@ verbose_free (void *buf)
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
test_obstack_alloc (void)
|
||||
{
|
||||
int result = 0;
|
||||
int align = 2;
|
||||
@@ -62,3 +66,39 @@ main (void)
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
int
|
||||
test_obstack_printf (void)
|
||||
{
|
||||
int result = 0;
|
||||
int n;
|
||||
char *s;
|
||||
struct obstack ob;
|
||||
|
||||
obstack_init (&ob);
|
||||
|
||||
n = obstack_printf (&ob, "%s%d%c", "testing 1 ... 2 ... ", 3, '\n');
|
||||
result |= (n != 22);
|
||||
printf("obstack_printf => %d\n", n);
|
||||
|
||||
n = obstack_printf (&ob, "%s%d%c", "testing 3 ... 2 ... ", 1, '\0');
|
||||
result |= (n != 22);
|
||||
printf("obstack_printf => %d\n", n);
|
||||
|
||||
s = obstack_finish (&ob);
|
||||
printf("obstack_printf => %s\n", s);
|
||||
obstack_free (&ob, NULL);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
result |= test_obstack_alloc();
|
||||
result |= test_obstack_printf();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
Reference in New Issue
Block a user