vasprintf.c

来自「在Linux/Unix下面访问WINDOWS SQLSERVER 的ODBC驱动」· C语言 代码 · 共 120 行

C
120
字号
/* * vasprintf(3) * 20020809 entropy@tappedin.com * public domain.  no warranty.  use at your own risk.  have a nice day. */#if HAVE_CONFIG_H#include <config.h>#endif /* HAVE_CONFIG_H */#include <stdarg.h>#include <stdio.h>#if HAVE_STDLIB_H#include <stdlib.h>#endif /* HAVE_STDLIB_H */#if HAVE_STRING_H#include <string.h>#endif /* HAVE_STRING_H */#if HAVE_UNISTD_H#include <unistd.h>#endif /* HAVE_UNISTD_H */#if HAVE_PATHS_H#include <paths.h>#endif /* HAVE_PATHS_H */#include "tds_sysdep_private.h"#include "replacements.h"TDS_RCSID(var, "$Id: vasprintf.c,v 1.18 2007/12/27 13:45:23 freddy77 Exp $");#if defined(HAVE__VSNPRINTF) && !defined(HAVE_VSNPRINTF)#undef HAVE_VSNPRINTF#undef vsnprintf#define HAVE_VSNPRINTF 1#define vsnprintf _vsnprintf#endif#ifndef _PATH_DEVNULL#define _PATH_DEVNULL "/dev/null"#endif#define CHUNKSIZE 512intvasprintf(char **ret, const char *fmt, va_list ap){#if HAVE_VSNPRINTF	int chunks;	size_t buflen;	char *buf;	int len;	chunks = ((strlen(fmt) + 1) / CHUNKSIZE) + 1;	buflen = chunks * CHUNKSIZE;	for (;;) {		if ((buf = malloc(buflen)) == NULL) {			*ret = NULL;			return -1;		}		len = vsnprintf(buf, buflen, fmt, ap);		if (len >= 0 && (size_t) len < (buflen - 1)) {			break;		}		free(buf);		buflen = (++chunks) * CHUNKSIZE;		/* 		 * len >= 0 are required for vsnprintf implementation that 		 * return -1 of buffer insufficient		 */		if (len >= 0 && (size_t) len >= buflen) {			buflen = len + 1;		}	}	*ret = buf;	return len;#else /* HAVE_VSNPRINTF */#ifdef _REENTRANT	FILE *fp;#else /* !_REENTRANT */	static FILE *fp = NULL;#endif /* !_REENTRANT */	int len;	char *buf;	*ret = NULL;#ifdef _REENTRANT# ifdef WIN32#  error Win32 do not have /dev/null, should use vsnprintf version# endif	if ((fp = fopen(_PATH_DEVNULL, "w")) == NULL)		return -1;#else /* !_REENTRANT */	if ((fp == NULL) && ((fp = fopen(_PATH_DEVNULL, "w")) == NULL))		return -1;#endif /* !_REENTRANT */	len = vfprintf(fp, fmt, ap);#ifdef _REENTRANT	if (fclose(fp) != 0)		return -1;#endif /* _REENTRANT */	if (len < 0)		return len;	if ((buf = malloc(len + 1)) == NULL)		return -1;	if (vsprintf(buf, fmt, ap) != len)		return -1;	*ret = buf;	return len;#endif /* HAVE_VSNPRINTF */}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?