/*
	rsc_calldll.h

	R-Scriptの関数を呼び出すときの引数を表す構造体
	引数にアクセスするためのマクロ
	引数の型を表す定数
	DLL呼び出すための関数/マクロ
*/

#ifndef DEFINED_VARIABLE_A

typedef struct {			/* 整数型配列 */
	char *name;				// 配列変数の名前
	unsigned int num;		// 配列の要素数 ( 0 〜 num-1 の要素番号が利用可能 )
	unsigned int *pinteger;	// 配列の先頭ポインタ
} VARIABLE_A, *PVARIABLE_A;

typedef struct {			/* 文字列型配列 */
	char *name;				// 配列変数の名前
	unsigned int num;		// 配列の要素数 ( 0 〜 num-1 の要素番号が利用可能 )
	char **ptext;			// 配列の先頭ポインタ
} VARIABLE_D_A, *PVARIABLE_D_A;

#define DEFINED_VARIABLE_A 1

#endif /* DEFINED_VARIABLE_A */

#ifndef DEFINED_ARGS

struct ARGS {  /* List of Arguments  */
	struct ARGS *next;	// 次の引数へのポインタ(リスト)
	char type;			// データタイプ UFCT_ARG_INT:0以上の整数, UFCT_ARG_STRING:文字列, UFCT_ARG_INTS:整数配列, UFCT_ARG_STRINGS:文字列配列
	union VL {
		unsigned int	integer;	// 0以上の整数を入れる場合に使われる
        char			*text;		// 文字列を入れる場合に使われる
		PVARIABLE_A		pva;		// 整数配列を入れる場合に使われる
		PVARIABLE_D_A	pvda;		// 文字列配列を入れる場合に使われる
	} v;
};
#define DEFINED_ARGS	1

#endif /* DEFINED_ARGS */

// 外部DLL定義の関数を呼び出す場合の型
typedef unsigned int    (*RSC_CALLDLL_INT)(HWND, struct ARGS *);
typedef HGLOBAL (*RSC_CALLDLL_STRING)(HWND, struct ARGS *);

// struct ARGS へのアクセスを容易にするための置き換え
#ifndef ARG1

#define ARG1	args->v
#define ARG2	args->next->v
#define ARG3	args->next->next->v
#define ARG4	args->next->next->next->v
#define ARG5	args->next->next->next->next->v
#define ARG6	args->next->next->next->next->next->v
#define ARG7	args->next->next->next->next->next->next->v
#define ARG8	args->next->next->next->next->next->next->next->v
#define ARG9	args->next->next->next->next->next->next->next->next->v
#define ARG10	args->next->next->next->next->next->next->next->next->next->v
#define ARG11	args->next->next->next->next->next->next->next->next->next->next->v
#define ARG12	args->next->next->next->next->next->next->next->next->next->next->next->v
#define ARG13	args->next->next->next->next->next->next->next->next->next->next->next->next->v
#define ARG14	args->next->next->next->next->next->next->next->next->next->next->next->next->next->v
#define ARG15	args->next->next->next->next->next->next->next->next->next->next->next->next->next->next->v
#define ARG16	args->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->v
#define ARG17	args->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->v
#define ARG18	args->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->v
#define ARG19	args->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->v
#define ARG20	args->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->v

#endif /* ARG1 */

// type ( 引数のデータタイプ : 〜S は、その型の配列 )
#ifndef UFCT_ARG_INT

#define UFCT_ARG_INT			0
#define UFCT_ARG_STRING			1
#define UFCT_ARG_INTS			2
#define UFCT_ARG_STRINGS		3

#endif /* UFCT_ARG_INT */

// DLL関数の定義用の置き換え
#ifndef DllExport

#ifdef __cplusplus

#define DllExport extern "C" __declspec (dllexport)

#else /* __cplusplus */

#define DllExport __declspec (dllexport)

#endif /* __cplusplus */

#endif /* DllExport */
