/*
 *  R : A Computer Language for Statistical Data Analysis
 *  Copyright (C) 2001-2022  The R Core Team.
 *
 *  This header file 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 file is part of R. R is distributed under the terms of the
 *  GNU General Public License, either Version 2, June 1991 or Version 3,
 *  June 2007. See doc/COPYRIGHTS for details of the copyright status of R.
 *
 *  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
 *  GNU Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with this program; if not, a copy is available at
 *  https://www.R-project.org/Licenses/
 */

/*
  C functions used to register compiled code in packages.

  Those needed for that purpose are part of the API.

  Cleaned up for R 3.4.0, some changes require recompilation of packages.
 */

#ifndef  R_EXT_DYNLOAD_H_
#define  R_EXT_DYNLOAD_H_

#include <R_ext/Boolean.h>

/* Called with a variable argument set after casting to a compatible
   function pointer.  */
typedef void * (*DL_FUNC)(void);

typedef unsigned int R_NativePrimitiveArgType;

/* For interfaces to objects created with as.single */
#define SINGLESXP 302

/*
 These are very similar to those in Rdynpriv.h,
 but we maintain them separately to give us more freedom to do
 some computations on the internal versions that are derived from
 these definitions.
*/
typedef struct {
    const char *name;
    DL_FUNC     fun;
    int         numArgs;
    R_NativePrimitiveArgType *types;
} R_CMethodDef;

typedef R_CMethodDef R_FortranMethodDef;


typedef struct {
    const char *name;
    DL_FUNC     fun;
    int         numArgs;
} R_CallMethodDef;

typedef R_CallMethodDef R_ExternalMethodDef;


typedef struct _DllInfo DllInfo;

/*
  Currently ignore the graphics routines, accessible via .External.graphics()
  and .Call.graphics().
 */
#ifdef __cplusplus
extern "C" {
#endif
int R_registerRoutines(DllInfo *info, const R_CMethodDef * const croutines,
		       const R_CallMethodDef * const callRoutines,
		       const R_FortranMethodDef * const fortranRoutines,
		       const R_ExternalMethodDef * const externalRoutines);

Rboolean R_useDynamicSymbols(DllInfo *info, Rboolean value);
Rboolean R_forceSymbols(DllInfo *info, Rboolean value);

/* Not API */
DllInfo *R_getDllInfo(const char *name);

/* To be used by applications embedding R to register their symbols
   that are not related to any dynamic module/

   Not API
*/
DllInfo *R_getEmbeddingDllInfo(void);

typedef struct Rf_RegisteredNativeSymbol R_RegisteredNativeSymbol;
typedef enum {R_ANY_SYM=0, R_C_SYM, R_CALL_SYM, R_FORTRAN_SYM, R_EXTERNAL_SYM} NativeSymbolType;


/* Not API */
DL_FUNC R_FindSymbol(char const *, char const *,
		       R_RegisteredNativeSymbol *symbol);


/* Interface for exporting and importing functions from one package
   for use from C code in a package.  The registration part probably
   ought to be integrated with the other registrations.  The naming of
   these routines may be less than ideal.

   Declarations in the manual, so API
*/

void R_RegisterCCallable(const char *package, const char *name, DL_FUNC fptr);
DL_FUNC R_GetCCallable(const char *package, const char *name);

#ifdef __cplusplus
}
#endif

#endif /* R_EXT_DYNLOAD_H_ */
