diff --git a/include/Makefile.in b/include/Makefile.in index 99d74bae..4d8a59e5 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -506,6 +506,7 @@ SOURCES = \ msvcrt/setjmp.h \ msvcrt/share.h \ msvcrt/signal.h \ + msvcrt/stdarg.h \ msvcrt/stdbool.h \ msvcrt/stddef.h \ msvcrt/stdint.h \ @@ -521,6 +522,7 @@ SOURCES = \ msvcrt/time.h \ msvcrt/uchar.h \ msvcrt/unistd.h \ + msvcrt/vadefs.h \ msvcrt/wchar.h \ msvcrt/wctype.h \ mswsock.h \ diff --git a/include/msvcrt/stdarg.h b/include/msvcrt/stdarg.h new file mode 100644 index 00000000..6c6b6048 --- /dev/null +++ b/include/msvcrt/stdarg.h @@ -0,0 +1,31 @@ +/* + * Variable argument definitions + * + * Copyright 2022 Jacek Caban + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef _INC_STDARG +#define _INC_STDARG + +#include + +#define va_start(v,l) _crt_va_start(v,l) +#define va_arg(v,l) _crt_va_arg(v,l) +#define va_end(v) _crt_va_end(v) +#define va_copy(d,s) _crt_va_copy(d,s) + +#endif /* _INC_STDARG */ diff --git a/include/msvcrt/vadefs.h b/include/msvcrt/vadefs.h new file mode 100644 index 00000000..2a612fc0 --- /dev/null +++ b/include/msvcrt/vadefs.h @@ -0,0 +1,52 @@ +/* + * Variable argument definitions + * + * Copyright 2022 Jacek Caban + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef _INC_VADEFS +#define _INC_VADEFS + +#ifdef __cplusplus +#define _ADDRESSOF(v) (&reinterpret_cast(v)) +#else +#define _ADDRESSOF(v) (&(v)) +#endif + +#if defined(__GNUC__) || defined(__clang__) + +typedef __builtin_va_list va_list; +#define _crt_va_start(v,l) __builtin_va_start(v,l) +#define _crt_va_arg(v,l) __builtin_va_arg(v,l) +#define _crt_va_end(v) __builtin_va_end(v) +#define _crt_va_copy(d,s) __builtin_va_copy(d,s) + +#else + +typedef char *va_list; + +#if defined(__i386__) +#define _INTSIZEOF(n) ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1)) +#define _crt_va_start(v,l) ((v) = (va_list)_ADDRESSOF(l) + _INTSIZEOF(l)) +#define _crt_va_arg(v,l) (*(l *)(((v) += _INTSIZEOF(l)) - _INTSIZEOF(l))) +#define _crt_va_end(v) ((v) = (va_list)0) +#define _crt_va_copy(d,s) ((d) = (s)) +#endif + +#endif + +#endif /* _INC_VADEFS */