summaryrefslogtreecommitdiff
path: root/Build/source/texk/xdvik/my-vsnprintf.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/xdvik/my-vsnprintf.c')
-rw-r--r--Build/source/texk/xdvik/my-vsnprintf.c92
1 files changed, 92 insertions, 0 deletions
diff --git a/Build/source/texk/xdvik/my-vsnprintf.c b/Build/source/texk/xdvik/my-vsnprintf.c
new file mode 100644
index 00000000000..dc2b9b7603c
--- /dev/null
+++ b/Build/source/texk/xdvik/my-vsnprintf.c
@@ -0,0 +1,92 @@
+/*------------------------------------------------------------
+
+written by Stefan Ulrich <stefanulrich@users.sourceforge.net> 2001/02/25
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+------------------------------------------------------------*/
+
+#include <string.h>
+#include <stdio.h>
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "my-vsnprintf.h"
+
+#if !HAVE_VSNPRINTF || !HAVE_GOOD_VSNPRINTF
+/*------------------------------------------------------------
+ * my_vsnprintf - emulation of glibc2.1 vsnprintf, use if
+ * vsnprintf is not available
+ *
+ * Arguments:
+ * char *buf - buffer to print <format> string into
+ * int len - print only len characters of <format>
+ * char *format - format string
+ * va_list argp - variable argument list
+ *
+ * Returns:
+ * int size - number of characters that would have been
+ * written if enough space had been available
+ *
+ * Purpose:
+ * Implementation of GNU's vsnprintf using POSIX pipes (less
+ * portable and much slower than the original, but also much
+ * easier to implement ;-):
+ * Print the formatted string to a pipe and read back
+ * at most len-1 characters, appending a '\0' at the end.
+ *------------------------------------------------------------*/
+
+int
+my_vsnprintf(char *buf, int len, const char *format, va_list argp)
+{
+ int pipe_fd[2];
+ FILE *fd;
+ int size;
+#ifdef DEBUG
+ printf("=============my_vsnprintf called!\n");
+#endif
+ len--; /* for the trailing '\0' */
+
+ /* create a pipe for reading/writing */
+ if (xpipe(pipe_fd) == -1) {
+ perror("my_vsnprintf: pipe");
+ xdvi_exit(EXIT_FAILURE);
+ }
+ if ((fd = try_fdopen(pipe_fd[1], "w")) == NULL) {
+ perror("my_vsnprintf: fdopen");
+ xdvi_exit(EXIT_FAILURE);
+ }
+ /* instead of setting fd to non-buffering, flush it explicitly: */
+ /* setvbuf(fd, NULL, _IONBF, BUFSIZ); */
+ size = vfprintf(fd, format, argp);
+ fflush(fd);
+
+ /* wrote less characters than len -> adjust len for the subsequent read */
+ if (size < len) {
+ len = size;
+ }
+ read(pipe_fd[0], buf, len);
+ buf[len] = '\0'; /* always null-terminate */
+
+ fclose(fd);
+ close(pipe_fd[0]);
+ close(pipe_fd[1]);
+
+ return size;
+}
+
+#endif /* !HAVE_VSNPRINTF || !HAVE_GOOD_VSNPRINTF */