From a9aa206b7b8ac4e69f8c46233b4080e00e845ff5 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Mon, 27 May 2019 19:13:54 +0200 Subject: Move text-related code out of corelib/tools/ to corelib/text/ This includes byte array, string, char, unicode, locale, collation and regular expressions. Change-Id: I8b125fa52c8c513eb57a0f1298b91910e5a0d786 Reviewed-by: Volker Hilsheimer --- src/corelib/text/qvsnprintf.cpp | 129 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 src/corelib/text/qvsnprintf.cpp (limited to 'src/corelib/text/qvsnprintf.cpp') diff --git a/src/corelib/text/qvsnprintf.cpp b/src/corelib/text/qvsnprintf.cpp new file mode 100644 index 0000000000..43a21771a1 --- /dev/null +++ b/src/corelib/text/qvsnprintf.cpp @@ -0,0 +1,129 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qplatformdefs.h" + +#include "qbytearray.h" +#include "qstring.h" + +#include "string.h" + +QT_BEGIN_NAMESPACE + +#if !defined(QT_VSNPRINTF) || defined(Q_CLANG_QDOC) + +/*! + \relates QByteArray + + A portable \c vsnprintf() function. Will call \c ::vsnprintf(), \c + ::_vsnprintf(), or \c ::vsnprintf_s depending on the system, or + fall back to an internal version. + + \a fmt is the \c printf() format string. The result is put into + \a str, which is a buffer of at least \a n bytes. + + The caller is responsible to call \c va_end() on \a ap. + + \warning Since vsnprintf() shows different behavior on certain + platforms, you should not rely on the return value or on the fact + that you will always get a 0 terminated string back. + + Ideally, you should never call this function but use QString::asprintf() + instead. + + \sa qsnprintf(), QString::asprintf() +*/ + +int qvsnprintf(char *str, size_t n, const char *fmt, va_list ap) +{ + if (!str || !fmt) + return -1; + + const QByteArray ba = QString::vasprintf(fmt, ap).toLocal8Bit(); + + if (n > 0) { + size_t blen = qMin(size_t(ba.length()), size_t(n - 1)); + memcpy(str, ba.constData(), blen); + str[blen] = '\0'; // make sure str is always 0 terminated + } + + return ba.length(); +} + +#else + +QT_BEGIN_INCLUDE_NAMESPACE +#include +QT_END_INCLUDE_NAMESPACE + +int qvsnprintf(char *str, size_t n, const char *fmt, va_list ap) +{ + return QT_VSNPRINTF(str, n, fmt, ap); +} + +#endif + +/*! + \target bytearray-qsnprintf + \relates QByteArray + + A portable snprintf() function, calls qvsnprintf. + + \a fmt is the \c printf() format string. The result is put into + \a str, which is a buffer of at least \a n bytes. + + \warning Call this function only when you know what you are doing + since it shows different behavior on certain platforms. + Use QString::asprintf() to format a string instead. + + \sa qvsnprintf(), QString::asprintf() +*/ + +int qsnprintf(char *str, size_t n, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + int ret = qvsnprintf(str, n, fmt, ap); + va_end(ap); + + return ret; +} + +QT_END_NAMESPACE -- cgit v1.2.3