diff options
author | sanine <sanine.not@pm.me> | 2022-08-27 23:52:56 -0500 |
---|---|---|
committer | sanine <sanine.not@pm.me> | 2022-08-27 23:52:56 -0500 |
commit | a4dd0ad63c00f4dee3b86dfd3075d1d61b2b3180 (patch) | |
tree | 13bd5bfa15e6fea2a12f176bae79adf9c6fd0933 /3rdparty/plibsys/cmake/StdargDetect.cmake | |
parent | bde3e4f1bb7b8f8abca0884a7d994ee1c17a66b1 (diff) |
add plibsys
Diffstat (limited to '3rdparty/plibsys/cmake/StdargDetect.cmake')
-rw-r--r-- | 3rdparty/plibsys/cmake/StdargDetect.cmake | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/3rdparty/plibsys/cmake/StdargDetect.cmake b/3rdparty/plibsys/cmake/StdargDetect.cmake new file mode 100644 index 0000000..a85f59a --- /dev/null +++ b/3rdparty/plibsys/cmake/StdargDetect.cmake @@ -0,0 +1,74 @@ +# The MIT License +# +# Copyright (C) 2017 Jean-Damien Durand <jeandamiendurand@gmail.com> +# Copyright (C) 2019 Alexander Saprykin <saprykin.spb@gmail.com> +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# 'Software'), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +function (plibsys_detect_va_copy result) + # + # On platforms that supports va_start() and al. + # there is sometimes the need to do va_copy() when + # calling another va_list aware function. + # + # This means that va_copy() is not needed (thus not available) + # everywhere. + # + # We depend on stdarg.h in any case, stdio.h in some cases. + # + # Known implementations vary from va_copy to __va_copy (old proposed name). + # We check the _va_copy eventually. + # + set (P_VA_COPY FALSE) + foreach (KEYWORD "va_copy" "_va_copy" "__va_copy") + check_c_source_compiles (" + #include <stdio.h> + #include <stdlib.h> + #include <stdarg.h> + + void f (int i, ...) { + va_list args1, args2; + + va_start (args1, i); + ${KEYWORD}(args2, args1); + if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42) { + exit (1); + } + va_end (args1); + va_end (args2); + } + + int main () { + f (0, 42); + exit (0); + }" + PLIBSYS_${KEYWORD} + ) + + if (PLIBSYS_${KEYWORD}) + set (P_VA_COPY ${KEYWORD}) + break() + endif() + endforeach() + + # Assign result + set (${result} ${P_VA_COPY} PARENT_SCOPE) + +endfunction (plibsys_detect_va_copy) |