From 178b7fb2ba8338e2cb14dde0bc24ed3568a6461f Mon Sep 17 00:00:00 2001 From: Mark Olsen Date: Thu, 27 Dec 2007 15:11:07 +0000 Subject: [PATCH] Profanities for the two major C libraries. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@2819 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- fteqtv/libqtvc/Makefile | 13 +++++++ fteqtv/libqtvc/glibc_sucks.c | 52 +++++++++++++++++++++++++ fteqtv/libqtvc/msvc_sucks.c | 73 ++++++++++++++++++++++++++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 fteqtv/libqtvc/Makefile create mode 100644 fteqtv/libqtvc/glibc_sucks.c create mode 100644 fteqtv/libqtvc/msvc_sucks.c diff --git a/fteqtv/libqtvc/Makefile b/fteqtv/libqtvc/Makefile new file mode 100644 index 000000000..bb8cce660 --- /dev/null +++ b/fteqtv/libqtvc/Makefile @@ -0,0 +1,13 @@ + +OBJS = msvc_sucks.o glibc_sucks.o + +all: libqtvc.a + +libqtvc.a: $(OBJS) + rm -f $@ + $(AR) r $@ $^ + $(RANLIB) $@ + +clean: + rm -f $(OBJS) libqtvc.a + diff --git a/fteqtv/libqtvc/glibc_sucks.c b/fteqtv/libqtvc/glibc_sucks.c new file mode 100644 index 000000000..ac30ef01f --- /dev/null +++ b/fteqtv/libqtvc/glibc_sucks.c @@ -0,0 +1,52 @@ +/* $OpenBSD: strlcpy.c,v 1.11 2006/05/05 15:27:38 millert Exp $ */ + +/* + * Copyright (c) 1998 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +/* + * Copy src to string dst of size siz. At most siz-1 characters + * will be copied. Always NUL terminates (unless siz == 0). + * Returns strlen(src); if retval >= siz, truncation occurred. + */ +size_t +strlcpy(char *dst, const char *src, size_t siz) +{ + char *d = dst; + const char *s = src; + size_t n = siz; + + /* Copy as many bytes as will fit */ + if (n != 0) { + while (--n != 0) { + if ((*d++ = *s++) == '\0') + break; + } + } + + /* Not enough room in dst, add NUL and traverse rest of src */ + if (n == 0) { + if (siz != 0) + *d = '\0'; /* NUL-terminate dst */ + while (*s++) + ; + } + + return(s - src - 1); /* count does not include NUL */ +} + diff --git a/fteqtv/libqtvc/msvc_sucks.c b/fteqtv/libqtvc/msvc_sucks.c new file mode 100644 index 000000000..a73b5234a --- /dev/null +++ b/fteqtv/libqtvc/msvc_sucks.c @@ -0,0 +1,73 @@ +/* +Copyright (C) 2007 Mark Olsen + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the included (LICENSE) GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include +#include +#include + +static int vsnprintf_calcsize(const char *fmt, va_list va) +{ + void *mem; + unsigned int memsize; + int ret; + + memsize = 1024; + + do + { + mem = malloc(memsize); + + ret = _vsnprintf(mem, memsize-1, fmt,va); + if (ret == -1) + memsize*= 2; + + free(mem); + } while(ret == -1 && memsize); + + return ret; +} + +int vsnprintf(char *buf, size_t buflen, const char *fmt, va_list va) +{ + int ret; + + if (buflen == 0) + return vsnprintf_calcsize(fmt, va); + + ret = _vsnprintf(buf, buflen-1, fmt, va); + buf[buflen-1] = 0; + + if (ret == -1) + return vsnprintf_calcsize(fmt, va); + + return ret; +} + +int snprintf(char *buf, size_t buflen, const char *fmt, ...) +{ + int ret; + va_list va; + + va_start(va, fmt); + ret = vsnprintf(buf, buflen, fmt, va); + va_end(va); + + return ret; +} +