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:
Anthony G. Basile
2013-06-13 10:54:39 -04:00
committed by Bernhard Reutner-Fischer
parent f143f92069
commit 10d12e77d5
4 changed files with 80 additions and 5 deletions

View File

@@ -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

View File

@@ -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
View 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)

View File

@@ -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;
}