diff doc/manual/manual_dyncall_api.tex @ 490:17287342e273

manual: - removed all API description and referred to manual instead, to avoid outdated and/or duplicated doc - cleanups and clarificaions
author Tassilo Philipp
date Sun, 20 Mar 2022 14:26:55 +0100
parents e5820b7a3fbc
children 71c884e610f0
line wrap: on
line diff
--- a/doc/manual/manual_dyncall_api.tex	Fri Mar 18 12:36:49 2022 +0100
+++ b/doc/manual/manual_dyncall_api.tex	Sun Mar 20 14:26:55 2022 +0100
@@ -20,281 +20,229 @@
 \clearpage
 \section{\emph{Dyncall} C library API}
 
-The library provides low-level functionality to make foreign function calls
-from different run-time environments. The flexibility is constrained by the
-set of supported types.
-
-\paragraph{C interface style conventions}
-
-This manual and the \product{dyncall} library's C interface {\tt "dyncall.h"}
-use the following C source code style.
-
-
-\begin{table}[h]
-\begin{center}
-\begin{tabular*}{0.8\textwidth}{llll}
-Subject    & C symbol & Details & Example \\
-\hline  
-Types      
-  & {\tt DC\group{type name}}      
-  & lower-case & \capi{DCint}, \capi{DCfloat}, \capi{DClong}, \ldots\\
-Structures 
-  & {\tt DC\group{structure name}} 
-  & camel-case 
-  & \capi{DCCallVM}\\
-Functions  & {\tt dc\group{function name}}  & camel-case & \capi{dcNewCallVM}, \capi{dcArgInt}, \ldots\\
-\end{tabular*}
-\caption{C interface conventions}
-\label{sourcecode}
-\end{center}
-\end{table}
-
-\subsection{Supported C/C++ argument and return types}
-
-\begin{table}[h]
-\begin{center}
-\begin{tabular*}{0.75\textwidth}{ll}
-Type alias & C/C++ data type\\
-\hline
-DCbool     & \_Bool, bool\\
-DCchar     & char\\
-DCshort    & short\\
-DCint      & int\\
-DClong     & long\\
-DClonglong & long long\\
-DCfloat    & float\\
-DCdouble   & double\\
-DCpointer  & void*\\
-DCvoid     & void\\
-\end{tabular*}
-\caption{Supported C/C++ argument and return types}
-\label{types}
-\end{center}
-\end{table}
-
-\pagebreak
-
-\subsection{Call Virtual Machine - CallVM}
-
-This \emph{CallVM} is the main entry to the functionality of the library.
-
-\paragraph{Types}
-
-\begin{lstlisting}[language=c]
-typedef void DCCallVM; /* abstract handle */
-\end{lstlisting}
+See the dyncall(3) manpage for more information.
 
-\paragraph{Details}
-The \emph{CallVM} is a state machine that manages all aspects of a function 
-call from configuration, argument passing up the actual function call on
-the processor.
-
-\subsection{Allocation}
-
-\paragraph{Functions}
-
-\begin{lstlisting}[language=c]
-DCCallVM* dcNewCallVM (DCsize size);
-void      dcFree(DCCallVM* vm);
-\end{lstlisting}
-
-\lstinline{dcNewCallVM} creates a new \emph{CallVM} object, where
-\lstinline{size} specifies the max size of the internal stack that will be
-allocated and used to bind arguments to. Use \lstinline{dcFree} to
-destroy the \emph{CallVM} object.\\
-\\
-This will allocate memory using the system allocators or custom ones provided
-custom \capi{dcAllocMem} and \capi{dcFreeMem} macros are defined to override the
-default behaviour. See \capi{dyncall\_alloc.h} for defails.
-
-
-\subsection{Error Reporting}
-
-\paragraph{Function}
-
-\begin{lstlisting}[language=c]
-DCint dcGetError(DCCallVM* vm);
-\end{lstlisting}
-
-Returns the most recent error state code out of the following:
-
-\paragraph{Errors}
-
-\begin{table}[h]
-\begin{center}
-\begin{tabular*}{0.95\textwidth}{ll}
-Constant & Description\\
-\hline
-\lstinline@DC_ERROR_NONE@             & No error occured. \\
-\lstinline@DC_ERROR_UNSUPPORTED_MODE@ & Unsupported mode, caused by \lstinline@dcMode()@ \\
-\end{tabular*}
-\caption{CallVM calling convention modes}
-\label{errorcodes}
-\end{center}
-\end{table}
-
-\pagebreak
-
-\subsection{Configuration}
-
-\paragraph{Function}
-
-\begin{lstlisting}[language=c]
-void dcMode (DCCallVM* vm, DCint mode);
-\end{lstlisting}
-
-Sets the calling convention to use. Note that some mode/platform combination
-don't make any sense (e.g. using a PowerPC calling convention on a MIPS
-platform) and are silently ignored.
-
-\paragraph{Modes}
+%@@@ removed, as manpages are more precise and up to date ------------------->
 
-\begin{table}[h]
-\begin{center}
-\begin{tabular*}{0.95\textwidth}{ll}
-Constant & Description\\
-\hline
-\lstinline@DC_CALL_C_DEFAULT@            & C default function call for current platform\\
-\lstinline@DC_CALL_C_DEFAULT_THIS@       & C++ default method call for current platform\\
-\lstinline@DC_CALL_C_ELLIPSIS@           & C ellipsis function call (named arguments (before '...', but after hidden args))\\
-\lstinline@DC_CALL_C_ELLIPSIS_VARARGS@   & C ellipsis function call (variable/unnamed arguments (starting with '...'))\\
-\lstinline@DC_CALL_C_X86_CDECL@          & C x86 platforms standard call\\
-\lstinline@DC_CALL_C_X86_WIN32_STD@      & C x86 Windows standard call\\
-\lstinline@DC_CALL_C_X86_WIN32_FAST_MS@  & C x86 Windows Microsoft fast call\\
-\lstinline@DC_CALL_C_X86_WIN32_FAST_GNU@ & C x86 Windows GCC fast call\\
-\lstinline@DC_CALL_C_X86_WIN32_THIS_MS@  & C++ x86 Windows Microsoft thiscall\\
-\lstinline@DC_CALL_C_X86_WIN32_THIS_GNU@ & alias for DC\_CALL\_C\_X86\_CDECL (GNU thiscalls identical to cdecl)\\
-\lstinline@DC_CALL_C_X86_PLAN9@          & C x86 Plan9 call\\
-\lstinline@DC_CALL_C_X64_WIN64@          & C x64 Windows standard call\\
-\lstinline@DC_CALL_C_X64_WIN64_THIS@     & C++ x64 Windows thiscall\\
-\lstinline@DC_CALL_C_X64_SYSV@           & C x64 System V standard call\\
-\lstinline@DC_CALL_C_X64_SYSV_THIS@      & C++ x64 System V thiscall\\
-\lstinline@DC_CALL_C_PPC32_DARWIN@       & C ppc32 Mac OS X standard call\\
-\lstinline@DC_CALL_C_PPC32_OSX@          & alias for DC\_CALL\_C\_PPC32\_DARWIN\\
-\lstinline@DC_CALL_C_PPC32_SYSV@         & C ppc32 SystemV standard call\\
-\lstinline@DC_CALL_C_PPC32_LINUX@        & alias for DC\_CALL\_C\_PPC32\_SYSV\\
-\lstinline@DC_CALL_C_PPC64@              & C ppc64 SystemV standard call\\
-\lstinline@DC_CALL_C_PPC64_LINUX@        & alias for DC\_CALL\_C\_PPC64\\
-\lstinline@DC_CALL_C_ARM_ARM@            & C arm call (arm mode)\\
-\lstinline@DC_CALL_C_ARM_THUMB@          & C arm call (thumb mode)\\
-\lstinline@DC_CALL_C_ARM_ARM_EABI@       & C arm eabi call (arm mode)\\
-\lstinline@DC_CALL_C_ARM_THUMB_EABI@     & C arm eabi call (thumb mode)\\
-\lstinline@DC_CALL_C_ARM_ARMHF@          & C arm call (arm hardfloat - e.g. raspberry pi)\\
-\lstinline@DC_CALL_C_ARM64@              & C arm64 call (AArch64)\\
-\lstinline@DC_CALL_C_MIPS32_EABI@        & C mips32 eabi call\\
-\lstinline@DC_CALL_C_MIPS32_PSPSDK@      & alias for DC\_CALL\_C\_MIPS32\_EABI (deprecated)\\
-\lstinline@DC_CALL_C_MIPS32_O32@         & C mips32 o32 call\\
-\lstinline@DC_CALL_C_MIPS64_N64@         & C mips64 n64 call\\
-\lstinline@DC_CALL_C_MIPS64_N32@         & C mips64 n32 call\\
-\lstinline@DC_CALL_C_SPARC32@            & C sparc32 call\\
-\lstinline@DC_CALL_C_SPARC64@            & C sparc64 call\\
-\lstinline@DC_CALL_SYS_DEFAULT@          & C default syscall for current platform\\
-\lstinline@DC_CALL_SYS_X86_INT80H_BSD@   & C syscall for x86 BSD platforms\\
-\lstinline@DC_CALL_SYS_X86_INT80H_LINUX@ & C syscall for x86 Linux\\
-\lstinline@DC_CALL_SYS_X64_SYSCALL_SYSV@ & C syscall for x64 System V platforms\\
-\lstinline@DC_CALL_SYS_PPC32@            & C syscall for ppc32\\
-\lstinline@DC_CALL_SYS_PPC64@            & C syscall for ppc64\\
-\end{tabular*}
-\caption{CallVM calling convention modes}
-\label{callingconventionmodes}
-\end{center}
-\end{table}
-
-\paragraph{Details}
-
-\lstinline@DC_CALL_C_DEFAULT@ is the default standard C call on the target
-platform. It uses the standard C calling convention.
-\lstinline@DC_CALL_C_ELLIPSIS@ is used for C ellipsis calls which allow
-to build up a variable argument list.
-On many platforms, there is only one C calling convention. 
-The X86 platform provides a rich family of different calling conventions.
-\\
-
-
-\subsection{Machine state reset}
-
-\begin{lstlisting}[language=c]
-void dcReset(DCCallVM* vm);
-\end{lstlisting}
-
-Resets the internal stack of arguments and prepares it for a new call. This
-function should be called after setting the call mode (using dcMode), but prior
-to binding arguments to the CallVM (except for when setting mode
-DC\_SIGCHAR\_CC\_ELLIPSIS\_VARARGS, which is used prior to binding varargs of
-variadic functions). Use it also when reusing a CallVM, as arguments don't get
-flushed automatically after a function call invocation.\\
-Note: you should also call this function after initial creation of the a CallVM
-object, as dcNewCallVM doesn't do this, implicitly.\\
-
-\subsection{Argument binding}
-
-\paragraph{Functions}
-
-\begin{lstlisting}[language=c]
-void dcArgBool    (DCCallVM* vm, DCbool     arg);
-void dcArgChar    (DCCallVM* vm, DCchar     arg);
-void dcArgShort   (DCCallVM* vm, DCshort    arg);
-void dcArgInt     (DCCallVM* vm, DCint      arg);
-void dcArgLong    (DCCallVM* vm, DClong     arg);
-void dcArgLongLong(DCCallVM* vm, DClonglong arg);
-void dcArgFloat   (DCCallVM* vm, DCfloat    arg);
-void dcArgDouble  (DCCallVM* vm, DCdouble   arg);
-void dcArgPointer (DCCallVM* vm, DCpointer  arg);
-\end{lstlisting}
-
-\paragraph{Details}
-
-Used to bind arguments of the named types to the CallVM object.
-Arguments should be bound in \emph{left-to-right} order regarding the C
-function prototype.\\
-
-\subsection{Call invocation}
-
-\paragraph{Functions}
-
-\begin{lstlisting}[language=c]
-DCvoid     dcCallVoid    (DCCallVM* vm, DCpointer funcptr);
-DCbool     dcCallBool    (DCCallVM* vm, DCpointer funcptr);
-DCchar     dcCallChar    (DCCallVM* vm, DCpointer funcptr);
-DCshort    dcCallShort   (DCCallVM* vm, DCpointer funcptr);
-DCint      dcCallInt     (DCCallVM* vm, DCpointer funcptr);
-DClong     dcCallLong    (DCCallVM* vm, DCpointer funcptr);
-DClonglong dcCallLongLong(DCCallVM* vm, DCpointer funcptr);
-DCfloat    dcCallFloat   (DCCallVM* vm, DCpointer funcptr);
-DCdouble   dcCallDouble  (DCCallVM* vm, DCpointer funcptr);
-DCpointer  dcCallPointer (DCCallVM* vm, DCpointer funcptr);
-\end{lstlisting}
-
-\paragraph{Details}
-Calls the function specified by \emph{funcptr} with the arguments bound to
-the \emph{CallVM} and returns. Use the function that corresponds to the
-dynamically called function's return value.\\
-\\
-After the invocation of the foreign function call, the argument values are
-still bound and a second call using the same arguments can be issued. If you
-need to clear the argument bindings, you have to reset the \emph{CallVM}.
-
-\subsection{Formatted argument binding and calls (ANSI C ellipsis interface)}
-
-\paragraph{Functions}
-
-\begin{lstlisting}[language=c]
-void dcArgF  (DCCallVM* vm, const DCsigchar* signature, ...);
-void dcVArgF (DCCallVM* vm, const DCsigchar* signature, va_list args);
-void dcCallF (DCCallVM* vm, DCValue* result, DCpointer funcptr, 
-              const DCsigchar* signature, ...);
-void dcVCallF(DCCallVM* vm, DCValue* result, DCpointer funcptr, 
-              const DCsigchar* signature, va_list args);
-\end{lstlisting}
-
-\paragraph{Details}
-
-These functions can be used to operate \product{dyncall} via a printf-style
-functional interface, using a signature string encoding the argument types and 
-return type (and optionally also the calling convention used).
-\capi{dcArgF()} and \capi{dcVArgF()} just bind arguments to the \capi{DCCallVM}
-object, so any return value specified in the signature is ignored. \capi{dcCallF()}
-and \capi{dcVCallF()} also take a function pointer to call after binding the arguments.
-The return value will be stored in what \lstinline{result} points to.
-For more information about the signature format, refer to \ref{sigchar}.
-
+%The library provides low-level functionality to make foreign function calls
+%from different run-time environments. The flexibility is constrained by the
+%set of supported types.
+%
+%\paragraph{C interface style conventions}
+%
+%This manual and the \product{dyncall} library's C interface {\tt "dyncall.h"}
+%use the following C source code style.
+%
+%
+%\begin{table}[h]
+%\begin{center}
+%\begin{tabular*}{0.8\textwidth}{llll}
+%Subject    & C symbol & Details & Example \\
+%\hline  
+%Types      & {\tt DC\group{type name}}      & lower-case & \capi{DCint}, \capi{DCfloat}, \capi{DClong}, \ldots\\
+%Structures & {\tt DC\group{structure name}} & camel-case & \capi{DCCallVM}\\
+%Functions  & {\tt dc\group{function name}}  & camel-case & \capi{dcNewCallVM}, \capi{dcArgInt}, \ldots\\
+%           & {\tt dcb\group{function name}} &            & \capi{dcbNewCallback}, \ldots\\
+%           & {\tt dl\group{function name}}  &            & \capi{dlLoadLibrary}, \ldots\\
+%\end{tabular*}
+%\caption{C interface conventions}
+%\label{sourcecode}
+%\end{center}
+%\end{table}
+%
+%\subsection{Supported C/C++ argument and return types}
+%
+%\begin{table}[h]
+%\begin{center}
+%\begin{tabular*}{0.75\textwidth}{ll}
+%Type alias & C/C++ data type\\
+%\hline
+%DCbool     & \_Bool, bool\\
+%DCchar     & char, unsigned char\\
+%DCshort    & short, unsigned short\\
+%DCint      & int, unsigned char\\
+%DClong     & long, unsigned char\\
+%DClonglong & long long, unsigned char\\
+%DCfloat    & float\\
+%DCdouble   & double\\
+%DCpointer  & void*\\
+%DCvoid     & void\\
+%\em{...}   & \em{aggregates (struct, union)}
+%\end{tabular*}
+%\caption{Supported C/C++ argument and return types}
+%\label{types}
+%\end{center}
+%\end{table}
+%
+%\pagebreak
+%
+%\subsection{Call Virtual Machine - CallVM}
+%
+%This \emph{CallVM} is the main entry to the functionality of the library.
+%
+%\paragraph{Types}
+%
+%\begin{lstlisting}[language=c]
+%typedef void DCCallVM; /* abstract handle */
+%\end{lstlisting}
+%
+%\paragraph{Details}
+%The \emph{CallVM} is a state machine that manages all aspects of a function 
+%call from configuration, argument passing up the actual function call on
+%the processor.
+%
+%\subsection{Allocation}
+%
+%\paragraph{Functions}
+%
+%\begin{lstlisting}[language=c]
+%DCCallVM* dcNewCallVM (DCsize size);
+%void      dcFree(DCCallVM* vm);
+%\end{lstlisting}
+%
+%\lstinline{dcNewCallVM} creates a new \emph{CallVM} object, where
+%\lstinline{size} specifies the max size of the internal stack that will be
+%allocated and used to bind arguments to. Use \lstinline{dcFree} to
+%destroy the \emph{CallVM} object.\\
+%\\
+%This will allocate memory using the system allocators or custom ones provided
+%custom \capi{dcAllocMem} and \capi{dcFreeMem} macros are defined to override the
+%default behaviour. See \capi{dyncall\_alloc.h} for defails.
+%
+%
+%\subsection{Error Reporting}
+%
+%\paragraph{Function}
+%
+%\begin{lstlisting}[language=c]
+%DCint dcGetError(DCCallVM* vm);
+%\end{lstlisting}
+%
+%Returns the most recent error state code out of the following:
+%
+%\paragraph{Errors}
+%
+%\begin{table}[h]
+%\begin{center}
+%\begin{tabular*}{0.95\textwidth}{ll}
+%Constant & Description\\
+%\hline
+%\lstinline@DC_ERROR_NONE@             & No error occured. \\
+%\lstinline@DC_ERROR_UNSUPPORTED_MODE@ & Unsupported mode, caused by \lstinline@dcMode()@ \\
+%\end{tabular*}
+%\caption{CallVM calling convention modes}
+%\label{errorcodes}
+%\end{center}
+%\end{table}
+%
+%\pagebreak
+%
+%\subsection{Configuration}
+%
+%\paragraph{Function}
+%
+%\begin{lstlisting}[language=c]
+%void dcMode (DCCallVM* vm, DCint mode);
+%\end{lstlisting}
+%
+%Sets the calling convention to use. See dyncall.h for a list of available
+%modes. Note that some mode/platform combination don't make any sense (e.g.
+%using a PowerPC calling convention on a MIPS platform) and are silently
+%ignored.
+%
+%
+%\subsection{Machine state reset}
+%
+%\begin{lstlisting}[language=c]
+%void dcReset(DCCallVM* vm);
+%\end{lstlisting}
+%
+%Resets the internal stack of arguments and prepares it for a new call. This
+%function should be called after setting the initial/main call mode (using
+%dcMode()), but prior to binding arguments to the CallVM (sometimes dcMode()
+%calls are needed after pushing some args, e.g.  DC\_SIGCHAR\_CC\_ELLIPSIS\_VARARGS,
+%which is used prior to binding varargs of variadic functions). Use it also when
+%reusing a CallVM, as arguments don't get flushed automatically after a function
+%call invocation.\\
+%Note: you should also call this function after initial creation of the a CallVM
+%object, as dcNewCallVM doesn't do this, implicitly.
+%
+%
+%\subsection{Argument binding}
+%
+%\paragraph{Functions}
+%
+%\begin{lstlisting}[language=c]
+%void dcArgBool    (DCCallVM*, DCbool);
+%void dcArgChar    (DCCallVM*, DCchar);
+%void dcArgShort   (DCCallVM*, DCshort);
+%void dcArgInt     (DCCallVM*, DCint);
+%void dcArgLong    (DCCallVM*, DClong);
+%void dcArgLongLong(DCCallVM*, DClonglong);
+%void dcArgFloat   (DCCallVM*, DCfloat);
+%void dcArgDouble  (DCCallVM*, DCdouble);
+%void dcArgPointer (DCCallVM*, DCpointer);
+%void dcArgAggr    (DCCallVM*, const DCaggr*, const void*);
+%\end{lstlisting}
+%
+%\paragraph{Details}
+%
+%Used to bind arguments of the named types to the CallVM object.
+%Arguments should be bound in \emph{left-to-right} order regarding the C
+%function prototype.\\
+%\\
+%See the dyncall(3) manpage for more information.
+%
+%
+%\subsection{Call invocation}
+%
+%\paragraph{Functions}
+%
+%\begin{lstlisting}[language=c]
+%DCvoid     dcCallVoid    (DCCallVM*, DCpointer);
+%DCbool     dcCallBool    (DCCallVM*, DCpointer);
+%DCchar     dcCallChar    (DCCallVM*, DCpointer);
+%DCshort    dcCallShort   (DCCallVM*, DCpointer);
+%DCint      dcCallInt     (DCCallVM*, DCpointer);
+%DClong     dcCallLong    (DCCallVM*, DCpointer);
+%DClonglong dcCallLongLong(DCCallVM*, DCpointer);
+%DCfloat    dcCallFloat   (DCCallVM*, DCpointer);
+%DCdouble   dcCallDouble  (DCCallVM*, DCpointer);
+%DCpointer  dcCallPointer (DCCallVM*, DCpointer);
+%DCpointer  dcCallAggr(DCCallVM*, DCpointer, const DCaggr*, DCpointer);
+%void       dcBeginCallAggr(DCCallVM*, const DCaggr*);
+%\end{lstlisting}
+%
+%\paragraph{Details}
+%Calls the function specified by \emph{funcptr} with the arguments bound to
+%the \emph{CallVM} and returns. Use the function that corresponds to the
+%dynamically called function's return value.\\
+%\\
+%After the invocation of the foreign function call, the argument values are
+%still bound and a second call using the same arguments can be issued. If you
+%need to clear the argument bindings, you have to reset the \emph{CallVM}.\\
+%\\
+%See the dyncall(3) manpage for more information.
+%
+%\subsection{Formatted argument binding and calls (ANSI C ellipsis interface)}
+%
+%\paragraph{Functions}
+%
+%\begin{lstlisting}[language=c]
+%void dcArgF  (DCCallVM*, const DCsigchar*, ...);
+%void dcVArgF (DCCallVM*, const DCsigchar*, va_list);
+%void dcCallF (DCCallVM*, DCValue*, DCpointer, const DCsigchar*, ...);
+%void dcVCallF(DCCallVM*, DCValue*, DCpointer, const DCsigchar*, va_list);
+%\end{lstlisting}
+%
+%\paragraph{Details}
+%
+%These functions can be used to operate \product{dyncall} via a printf-style
+%functional interface, using a signature string encoding the argument types and 
+%return type (and optionally also the calling convention used).
+%\capi{dcArgF()} and \capi{dcVArgF()} just bind arguments to the \capi{DCCallVM}
+%object, so any return value specified in the signature is ignored. \capi{dcCallF()}
+%and \capi{dcVCallF()} also take a function pointer to call after binding the arguments.
+%The return value will be stored in what \lstinline{result} points to.
+%For more information about the signature format, refer to \ref{sigchar}.
+%