diff --git a/Makefile.in b/Makefile.in index 82939be3..8e55e83e 100644 --- a/Makefile.in +++ b/Makefile.in @@ -96,7 +96,7 @@ LIBOBJ = stdlib/snprintf.$(O) stdlib/vsnprintf.$(O) stdlib/strlcpy.$(O) \ stdlib/strnlen.$(O) stdlib/strrchrnul.$(O) \ \ nasmlib/ver.$(O) \ - nasmlib/crc64.$(O) nasmlib/malloc.$(O) \ + nasmlib/crc64.$(O) nasmlib/alloc.$(O) nasmlib/asprintf.$(O) \ nasmlib/md5c.$(O) nasmlib/string.$(O) nasmlib/nctype.$(O) \ nasmlib/file.$(O) nasmlib/mmap.$(O) nasmlib/ilog2.$(O) \ nasmlib/realpath.$(O) nasmlib/path.$(O) \ diff --git a/Mkfiles/msvc.mak b/Mkfiles/msvc.mak index 7ea3b55a..89e392d9 100644 --- a/Mkfiles/msvc.mak +++ b/Mkfiles/msvc.mak @@ -68,11 +68,11 @@ LIBOBJ = stdlib\snprintf.$(O) stdlib\vsnprintf.$(O) stdlib\strlcpy.$(O) \ stdlib\strnlen.$(O) stdlib\strrchrnul.$(O) \ \ nasmlib\ver.$(O) \ - nasmlib\crc64.$(O) nasmlib\malloc.$(O) \ + nasmlib\crc64.$(O) nasmlib\alloc.$(O) nasmlib\asprintf.$(O) \ nasmlib\md5c.$(O) nasmlib\string.$(O) nasmlib\nctype.$(O) \ nasmlib\file.$(O) nasmlib\mmap.$(O) nasmlib\ilog2.$(O) \ nasmlib\realpath.$(O) nasmlib\path.$(O) \ - nasmlib\filename.$(O) nasmlib\srcfile.$(O) \ + nasmlib\filename.$(O) \ nasmlib\zerobuf.$(O) nasmlib\readnum.$(O) nasmlib\bsi.$(O) \ nasmlib\rbtree.$(O) nasmlib\hashtbl.$(O) \ nasmlib\raa.$(O) nasmlib\saa.$(O) \ @@ -97,7 +97,7 @@ LIBOBJ = stdlib\snprintf.$(O) stdlib\vsnprintf.$(O) stdlib\strlcpy.$(O) \ asm\segalloc.$(O) \ asm\preproc-nop.$(O) \ asm\rdstrnum.$(O) \ - \ + asm\srcfile.$(O) \ macros\macros.$(O) \ \ output\outform.$(O) output\outlib.$(O) output\legacy.$(O) \ diff --git a/Mkfiles/openwcom.mak b/Mkfiles/openwcom.mak index 2b0031af..1c407dea 100644 --- a/Mkfiles/openwcom.mak +++ b/Mkfiles/openwcom.mak @@ -57,11 +57,11 @@ LIBOBJ = stdlib\snprintf.$(O) stdlib\vsnprintf.$(O) stdlib\strlcpy.$(O) & stdlib\strnlen.$(O) stdlib\strrchrnul.$(O) & & nasmlib\ver.$(O) & - nasmlib\crc64.$(O) nasmlib\malloc.$(O) & + nasmlib\crc64.$(O) nasmlib\alloc.$(O) nasmlib\asprintf.$(O) & nasmlib\md5c.$(O) nasmlib\string.$(O) nasmlib\nctype.$(O) & nasmlib\file.$(O) nasmlib\mmap.$(O) nasmlib\ilog2.$(O) & nasmlib\realpath.$(O) nasmlib\path.$(O) & - nasmlib\filename.$(O) nasmlib\srcfile.$(O) & + nasmlib\filename.$(O) & nasmlib\zerobuf.$(O) nasmlib\readnum.$(O) nasmlib\bsi.$(O) & nasmlib\rbtree.$(O) nasmlib\hashtbl.$(O) & nasmlib\raa.$(O) nasmlib\saa.$(O) & @@ -86,7 +86,7 @@ LIBOBJ = stdlib\snprintf.$(O) stdlib\vsnprintf.$(O) stdlib\strlcpy.$(O) & asm\segalloc.$(O) & asm\preproc-nop.$(O) & asm\rdstrnum.$(O) & - & + asm\srcfile.$(O) & macros\macros.$(O) & & output\outform.$(O) output\outlib.$(O) output\legacy.$(O) & diff --git a/configure.ac b/configure.ac index 2b2858ec..878b3269 100644 --- a/configure.ac +++ b/configure.ac @@ -118,6 +118,8 @@ AC_CHECK_FUNCS(strrchrnul) AC_CHECK_FUNCS(iscntrl) AC_CHECK_FUNCS(isascii) +AC_CHECK_FUNCS(vasprintf) + AC_CHECK_FUNCS(getuid) AC_CHECK_FUNCS(getgid) diff --git a/include/compiler.h b/include/compiler.h index 4178c98e..4ce60ccc 100644 --- a/include/compiler.h +++ b/include/compiler.h @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2007-2017 The NASM Authors - All Rights Reserved + * Copyright 2007-2018 The NASM Authors - All Rights Reserved * See the file AUTHORS included with the NASM distribution for * the specific copyright holders. * @@ -81,6 +81,7 @@ #include #include #include +#include #include #ifdef HAVE_SYS_TYPES_H @@ -350,6 +351,24 @@ size_t strnlen(const char *s, size_t maxlen); # define is_constant(x) false #endif +/* + * The autoconf documentation states: + * + * `va_copy' + * The C99 standard provides `va_copy' for copying `va_list' + * variables. It may be available in older environments too, though + * possibly as `__va_copy' (e.g., `gcc' in strict pre-C99 mode). + * These can be tested with `#ifdef'. A fallback to `memcpy (&dst, + * &src, sizeof (va_list))' gives maximum portability. + */ +#ifndef va_copy +# ifdef __va_copy +# define va_copy(dst,src) __va_copy(dst,src) +# else +# define va_copy(dst,src) memcpy(&(dst),&(src),sizeof(va_list)) +# endif +#endif + /* Watcom doesn't handle switch statements with 64-bit types, hack around it */ #ifdef __WATCOMC__ # define BOGUS_CASE 0x76543210 diff --git a/include/nasmlib.h b/include/nasmlib.h index db624987..7d07a216 100644 --- a/include/nasmlib.h +++ b/include/nasmlib.h @@ -48,11 +48,11 @@ #endif /* - * Wrappers around malloc, realloc and free. nasm_malloc will - * fatal-error and die rather than return NULL; nasm_realloc will - * do likewise, and will also guarantee to work right on being - * passed a NULL pointer; nasm_free will do nothing if it is passed - * a NULL pointer. + * Wrappers around malloc, realloc, free and a few more. nasm_malloc + * will fatal-error and die rather than return NULL; nasm_realloc will + * do likewise, and will also guarantee to work right on being passed + * a NULL pointer; nasm_free will do nothing if it is passed a NULL + * pointer. */ void * safe_malloc(1) nasm_malloc(size_t); void * safe_malloc(1) nasm_zalloc(size_t); @@ -64,6 +64,14 @@ char * safe_alloc nasm_strndup(const char *, size_t); char * safe_alloc nasm_strcat(const char *one, const char *two); char * safe_alloc end_with_null nasm_strcatn(const char *one, ...); +/* + * Variants on asprintf(). Note that unlike the standard version, we + * return the pointer rather than the length; if you want the length + * use %n. + */ +char * safe_alloc nasm_asprintf(const char *fmt, ...); +char * safe_alloc nasm_vasprintf(const char *fmt, va_list ap); + /* Assert the argument is a pointer without evaluating it */ #define nasm_assert_pointer(p) ((void)sizeof(*(p))) diff --git a/nasmlib/malloc.c b/nasmlib/alloc.c similarity index 95% rename from nasmlib/malloc.c rename to nasmlib/alloc.c index 1e643185..2f3f9519 100644 --- a/nasmlib/malloc.c +++ b/nasmlib/alloc.c @@ -36,24 +36,15 @@ */ #include "compiler.h" - -#include - #include "nasmlib.h" #include "error.h" +#include "alloc.h" -static no_return nasm_alloc_failed(void) +no_return nasm_alloc_failed(void) { nasm_fatal("out of memory"); } -static inline void *validate_ptr(void *p) -{ - if (unlikely(!p)) - nasm_alloc_failed(); - return p; -} - void *nasm_malloc(size_t size) { return validate_ptr(malloc(size)); diff --git a/nasmlib/alloc.h b/nasmlib/alloc.h new file mode 100644 index 00000000..c599d213 --- /dev/null +++ b/nasmlib/alloc.h @@ -0,0 +1,48 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 1996-2018 The NASM Authors - All Rights Reserved + * See the file AUTHORS included with the NASM distribution for + * the specific copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following + * conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ----------------------------------------------------------------------- */ + +#ifndef NASMLIB_ALLOC_H +#define NASMLIB_ALLOC_H + +#include "compiler.h" + +no_return nasm_alloc_failed(void); + +static inline void *validate_ptr(void *p) +{ + if (unlikely(!p)) + nasm_alloc_failed(); + return p; +} + +#endif /* NASMLIB_ALLOC_H */