xprintf.c revision 6747b715
1/* 2 * printf routines which xalloc their buffer 3 */ 4/* 5 * Copyright (c) 2004 Alexander Gottwald 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the "Software"), 9 * to deal in the Software without restriction, including without limitation 10 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11 * and/or sell copies of the Software, and to permit persons to whom the 12 * Software is furnished to do so, subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be included in 15 * all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 21 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 22 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23 * DEALINGS IN THE SOFTWARE. 24 * 25 * Except as contained in this notice, the name(s) of the above copyright 26 * holders shall not be used in advertising or otherwise to promote the sale, 27 * use or other dealings in this Software without prior written authorization. 28 */ 29#ifdef HAVE_DIX_CONFIG_H 30#include <dix-config.h> 31#endif 32 33#include <X11/Xos.h> 34#include "os.h" 35#include <stdarg.h> 36#include <stdio.h> 37 38#ifndef va_copy 39# ifdef __va_copy 40# define va_copy __va_copy 41# else 42# error "no working va_copy was found" 43# endif 44#endif 45 46char * 47Xvprintf(const char *format, va_list va) 48{ 49 char *ret; 50 int size; 51 va_list va2; 52 53 va_copy(va2, va); 54 size = vsnprintf(NULL, 0, format, va2); 55 va_end(va2); 56 57 ret = (char *)malloc(size + 1); 58 if (ret == NULL) 59 return NULL; 60 61 vsnprintf(ret, size + 1, format, va); 62 ret[size] = 0; 63 return ret; 64} 65 66char *Xprintf(const char *format, ...) 67{ 68 char *ret; 69 va_list va; 70 va_start(va, format); 71 ret = Xvprintf(format, va); 72 va_end(va); 73 return ret; 74} 75 76char * 77XNFvprintf(const char *format, va_list va) 78{ 79 char *ret; 80 int size; 81 va_list va2; 82 83 va_copy(va2, va); 84 size = vsnprintf(NULL, 0, format, va2); 85 va_end(va2); 86 87 ret = (char *)xnfalloc(size + 1); 88 if (ret == NULL) 89 return NULL; 90 91 vsnprintf(ret, size + 1, format, va); 92 ret[size] = 0; 93 return ret; 94} 95 96char *XNFprintf(const char *format, ...) 97{ 98 char *ret; 99 va_list va; 100 va_start(va, format); 101 ret = XNFvprintf(format, va); 102 va_end(va); 103 return ret; 104} 105