/*
 *  footest - illustrate the effects of the Win32 calling conventions
 */

#include <stdio.h>
#include <stdarg.h>

int __declspec(dllimport) _cdecl   fn_two_args_import_cdecl(int i, int j);
int __declspec(dllimport) _stdcall fn_two_args_import_stdcall(int i, int j);
int __declspec(dllimport) _cdecl   fn_one_plus_import_cdecl(int i, ...);
int __declspec(dllimport) _stdcall fn_one_plus_import_stdcall(int i, ...);

int __declspec(dllexport) _cdecl   fn_two_args_export_cdecl(int i, int j);
int __declspec(dllexport) _stdcall fn_two_args_export_stdcall(int i, int j);
int __declspec(dllexport) _cdecl   fn_one_plus_export_cdecl(int i, ...);
int __declspec(dllexport) _stdcall fn_one_plus_export_stdcall(int i, ...);

int test_import(int i, int j) 
{
    int rv = 0;
    rv += fn_two_args_import_cdecl(i, j);
    rv += fn_two_args_import_stdcall(i, j);
    rv += fn_one_plus_import_cdecl(i, j);
    rv += fn_one_plus_import_stdcall(i, j);
    return rv;
}

int test_export(int i, int j) 
{
    int rv = 0;
    rv += fn_two_args_export_cdecl(i, j);
    rv += fn_two_args_export_stdcall(i, j);
    rv += fn_one_plus_export_cdecl(i, j);
    rv += fn_one_plus_export_stdcall(i, j);
    return rv;
}

int __declspec(dllexport) _cdecl   fn_two_args_export_cdecl(int i, int j)
{
    return i + j;
}

int __declspec(dllexport) _stdcall fn_two_args_export_stdcall(int i, int j)
{
    return i + j;
}

int __declspec(dllexport) _cdecl   fn_one_plus_export_cdecl(int i, ...)
{
    va_list vlist;
    va_start(vlist, i);
    return i + va_arg(vlist,int);
    va_end(vlist);
}

int __declspec(dllexport) _stdcall fn_one_plus_export_stdcall(int i, ...)
{
    va_list vlist;
    va_start(vlist, i);
    return i + va_arg(vlist,int);
    va_end(vlist);
}

int main (int argc, char **argv)
{
    printf ("import is %d", test_import(5, 7));
    printf ("export is %d", test_export(5, 7));
}
