blob: 1f7f16075a2157fc94c3048fae00cec7516609cf [file] [log] [blame] [edit]
/*
* BRLTTY - A background process providing access to the console screen (when in
* text mode) for a blind person using a refreshable braille display.
*
* Copyright (C) 1995-2023 by The BRLTTY Developers.
*
* BRLTTY comes with ABSOLUTELY NO WARRANTY.
*
* This is free software, placed under the terms of the
* GNU Lesser General Public License, as published by the Free Software
* Foundation; either version 2.1 of the License, or (at your option) any
* later version. Please see the file LICENSE-LGPL for details.
*
* Web Page: http://brltty.app/
*
* This software is maintained by Dave Mielke <dave@mielke.cc>.
*/
#ifndef BRLTTY_INCLUDED_STRFMT
#define BRLTTY_INCLUDED_STRFMT
#include <stdio.h>
#include "strfmth.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define STR_BEGIN(buffer, size) { \
char *strNext = (buffer); \
const char *const strStart = strNext; \
const char *const strEnd = strStart + (size); \
const char *const strLast = strEnd - 1; \
*strNext = 0;
#define STR_END }
#define STR_LENGTH (size_t)(strNext - strStart)
#define STR_NEXT strNext
#define STR_LEFT (size_t)(strEnd - strNext)
#define STR_POP() ((strNext > strStart)? --strNext: NULL)
#define STR_ADJUST(length) \
do { if ((strNext += (length)) > strLast) strNext = (char *)strLast; } while (0)
#define STR_BEGIN_FORMATTER(name, ...) \
STR_DECLARE_FORMATTER(name, __VA_ARGS__) { \
size_t strFormatterResult; \
STR_BEGIN(strFormatterBuffer, strFormatterSize);
#define STR_END_FORMATTER \
strFormatterResult = STR_LENGTH; \
STR_END; \
return strFormatterResult; \
}
#define STR_FORMAT(formatter, ...) \
STR_ADJUST(formatter(STR_NEXT, STR_LEFT, __VA_ARGS__))
#define STR_PRINTF(...) \
STR_FORMAT(snprintf, __VA_ARGS__)
#define STR_VPRINTF(format, arguments) \
STR_FORMAT(vsnprintf, format, arguments)
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* BRLTTY_INCLUDED_STRFMT */