summaryrefslogtreecommitdiff
path: root/Userland/Libraries
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2021-03-28 18:39:32 +0200
committerAndreas Kling <kling@serenityos.org>2021-03-28 18:39:32 +0200
commitfdd01a0a07d98581a2879ae7dbf49f37b41b23e4 (patch)
tree24c9edbfe83570190f1f43fe96f4c772883cae57 /Userland/Libraries
parent5f71bf0cc7de17d0aa2703aabf4e0cad5f000ae8 (diff)
downloadserenity-fdd01a0a07d98581a2879ae7dbf49f37b41b23e4.zip
LibC: Implement asprintf() and vasprintf()
These simply use StringBuilder::appendvf() internally which is not optimal in terms of heap allocations, but simple enough and I don't think they are performance sensitive functions anyway.
Diffstat (limited to 'Userland/Libraries')
-rw-r--r--Userland/Libraries/LibC/stdio.cpp24
-rw-r--r--Userland/Libraries/LibC/stdio.h4
2 files changed, 27 insertions, 1 deletions
diff --git a/Userland/Libraries/LibC/stdio.cpp b/Userland/Libraries/LibC/stdio.cpp
index 56e74dd5cb..99b19ca8f8 100644
--- a/Userland/Libraries/LibC/stdio.cpp
+++ b/Userland/Libraries/LibC/stdio.cpp
@@ -29,6 +29,7 @@
#include <AK/PrintfImplementation.h>
#include <AK/ScopedValueRollback.h>
#include <AK/StdLibExtras.h>
+#include <AK/String.h>
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
@@ -880,6 +881,29 @@ int printf(const char* fmt, ...)
return ret;
}
+int vasprintf(char** strp, const char* fmt, va_list ap)
+{
+ StringBuilder builder;
+ builder.appendvf(fmt, ap);
+ VERIFY(builder.length() <= NumericLimits<int>::max());
+ int length = builder.length();
+ *strp = strdup(builder.to_string().characters());
+ return length;
+}
+
+int asprintf(char** strp, const char* fmt, ...)
+{
+ StringBuilder builder;
+ va_list ap;
+ va_start(ap, fmt);
+ builder.appendvf(fmt, ap);
+ va_end(ap);
+ VERIFY(builder.length() <= NumericLimits<int>::max());
+ int length = builder.length();
+ *strp = strdup(builder.to_string().characters());
+ return length;
+}
+
static void buffer_putch(char*& bufptr, char ch)
{
*bufptr++ = ch;
diff --git a/Userland/Libraries/LibC/stdio.h b/Userland/Libraries/LibC/stdio.h
index 018c57fe47..97cc91eda1 100644
--- a/Userland/Libraries/LibC/stdio.h
+++ b/Userland/Libraries/LibC/stdio.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
+ * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -89,6 +89,7 @@ size_t fread(void* ptr, size_t size, size_t nmemb, FILE*);
size_t fwrite(const void* ptr, size_t size, size_t nmemb, FILE*);
int vprintf(const char* fmt, va_list) __attribute__((format(printf, 1, 0)));
int vfprintf(FILE*, const char* fmt, va_list) __attribute__((format(printf, 2, 0)));
+int vasprintf(char** strp, const char* fmt, va_list) __attribute__((format(printf, 2, 0)));
int vsprintf(char* buffer, const char* fmt, va_list) __attribute__((format(printf, 2, 0)));
int vsnprintf(char* buffer, size_t, const char* fmt, va_list) __attribute__((format(printf, 3, 0)));
int fprintf(FILE*, const char* fmt, ...) __attribute__((format(printf, 2, 3)));
@@ -96,6 +97,7 @@ int printf(const char* fmt, ...) __attribute__((format(printf, 1, 2)));
void dbgputch(char);
void dbgputstr(const char*, size_t);
int sprintf(char* buffer, const char* fmt, ...) __attribute__((format(printf, 2, 3)));
+int asprintf(char** strp, const char* fmt, ...) __attribute__((format(printf, 2, 3)));
int snprintf(char* buffer, size_t, const char* fmt, ...) __attribute__((format(printf, 3, 4)));
int putchar(int ch);
int putc(int ch, FILE*);