DPDK patches and discussions
 help / color / mirror / Atom feed
From: Andre Muezerie <andremue@linux.microsoft.com>
To: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>,
	Tyler Retzlaff <roretzla@linux.microsoft.com>,
	Thomas Monjalon <thomas@monjalon.net>
Cc: dev@dpdk.org, Andre Muezerie <andremue@linux.microsoft.com>
Subject: [PATCH] eal: add asprintf() function for Windows
Date: Mon,  5 May 2025 18:43:09 -0700	[thread overview]
Message-ID: <1746495789-14101-1-git-send-email-andremue@linux.microsoft.com> (raw)

The asprintf function is not part of the C standard library but is a
GNU extension commonly available in Unix-like systems. It dynamically
allocates memory to store the formatted output string, similar to
sprintf, but avoids buffer overflow issues by automatically sizing
the buffer.

Instead of rewriting it or coming up with some other replacement, this
patch makes use of the implementation provided by Neved4.

Signed-off-by: Andre Muezerie <andremue@linux.microsoft.com>
---
 lib/eal/windows/asprintf.c         | 48 ++++++++++++++++++++++++++++++
 lib/eal/windows/include/asprintf.h | 21 +++++++++++++
 lib/eal/windows/meson.build        |  1 +
 license/exceptions.txt             |  2 ++
 4 files changed, 72 insertions(+)
 create mode 100644 lib/eal/windows/asprintf.c
 create mode 100644 lib/eal/windows/include/asprintf.h

diff --git a/lib/eal/windows/asprintf.c b/lib/eal/windows/asprintf.c
new file mode 100644
index 0000000000..6ebc9d0f0a
--- /dev/null
+++ b/lib/eal/windows/asprintf.c
@@ -0,0 +1,48 @@
+/* SPDX-License-Identifier: MIT
+ * Copyright(C) 2023 - 2025 Neved4
+ * https://github.com/Neved4/asprintf/tree/main
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "asprintf.h"
+
+#ifndef RTE_TOOLCHAIN_GCC
+int vasprintf(char **strp, const char *fmt, va_list ap)
+{
+	int size, res;
+	va_list cp;
+
+	va_copy(cp, ap);
+	size = vsnprintf(NULL, 0, fmt, cp);
+	va_end(cp);
+
+	if (size < 0)
+		return -1;
+
+	*strp = malloc(size + 1);
+	if (*strp == NULL)
+		return -1;
+
+	res = vsnprintf(*strp, size + 1, fmt, ap);
+	if (res < 0) {
+		free(*strp);
+		return -1;
+	}
+
+	return res;
+}
+
+int asprintf(char **s, const char *fmt, ...)
+{
+	int ret;
+	va_list ap;
+
+	va_start(ap, fmt);
+	ret = vasprintf(s, fmt, ap);
+	va_end(ap);
+
+	return ret;
+}
+#endif
diff --git a/lib/eal/windows/include/asprintf.h b/lib/eal/windows/include/asprintf.h
new file mode 100644
index 0000000000..36d052b808
--- /dev/null
+++ b/lib/eal/windows/include/asprintf.h
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: MIT
+ * Copyright(C) 2023 - 2025 Neved4
+ * https://github.com/Neved4/asprintf/tree/main
+ */
+
+/**
+ * @file
+ * asprintf compat.
+ *
+ * This module provides asprintf() and vasprintf().
+ */
+
+#pragma once
+
+#include <stdarg.h>
+
+#ifndef RTE_TOOLCHAIN_GCC
+int vasprintf(char **strp, const char *fmt, va_list ap);
+
+int asprintf(char **s, const char *fmt, ...);
+#endif
diff --git a/lib/eal/windows/meson.build b/lib/eal/windows/meson.build
index 7756d417be..06b25a3a09 100644
--- a/lib/eal/windows/meson.build
+++ b/lib/eal/windows/meson.build
@@ -4,6 +4,7 @@
 subdir('include')
 
 sources += files(
+        'asprintf.c',
         'eal.c',
         'eal_alarm.c',
         'eal_debug.c',
diff --git a/license/exceptions.txt b/license/exceptions.txt
index d12fac2034..5ea0de5308 100644
--- a/license/exceptions.txt
+++ b/license/exceptions.txt
@@ -16,4 +16,6 @@ MIT                  | 10/23/2019       | 02/10/2020       | lib/eal/windows/inc
 BSD-2-Clause         | 10/23/2019       | 12/18/2019       | lib/eal/windows/include/getopt.h
 ISC AND BSD-2-Clause | 10/23/2019       | 12/18/2019       | lib/eal/windows/getopt.c
 MIT                  | 10/19/2022       | 10/18/2022       | drivers/net/gve/base/*
+MIT                  | XX/XX/XXXX       | XX/XX/XXXX       | lib/eal/windows/include/asprintf.h
+MIT                  | XX/XX/XXXX       | XX/XX/XXXX       | lib/eal/windows/asprintf.c
 ---------------------------------------------------------------------------------------------------
-- 
2.49.0.vfs.0.2


                 reply	other threads:[~2025-05-06  1:43 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1746495789-14101-1-git-send-email-andremue@linux.microsoft.com \
    --to=andremue@linux.microsoft.com \
    --cc=dev@dpdk.org \
    --cc=dmitry.kozliuk@gmail.com \
    --cc=roretzla@linux.microsoft.com \
    --cc=thomas@monjalon.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).