From: Felix <fe...@call-with-current-continuation.org> Subject: Re: [Chicken-users] Question about embedding Chicken scheme Date: Tue, 22 Jan 2013 21:59:53 +0100 (CET)
> From: Julian Day <jcd...@mail.usask.ca> > Subject: Re: [Chicken-users] Question about embedding Chicken scheme > Date: Mon, 21 Jan 2013 18:41:21 -0600 > >> On 20/01/2013 2:53 PM, Felix wrote: >> >>> That's correct. Visual C++ is currently not supported and the current >>> CHICKEN sources will not compile with it. >> >> Hi Felix, >> >> Are there any fundamental issues preventing Visual C++ support, or is >> it a case of there just being no support at present? > > There is currently no one who is willing to maintain the build. > Visual C++ support was there once - to resurrect it, it would be > necessary to dig in the repo history. But there is no intrinsic reason > for a lack of support apart from having to deal with MS development > tools. Attached is an (untested) patch with changes I pulled out of the very first commit in the git repository. It may be a start for getting MSVC support back into a usable state. cheers, felix
diff --git a/chicken.h b/chicken.h index 566aad3..c812b8d 100644 --- a/chicken.h +++ b/chicken.h @@ -93,7 +93,8 @@ # define C_SOLARIS #endif -#ifdef __MINGW64__ +/*YYY MSVC variant? */ +#if defined(__MINGW64__) # define C_LLP #endif @@ -141,14 +142,21 @@ # include <sys/byteorder.h> #endif -#if defined(__MINGW32__) || defined(__WATCOMC__) +#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(_MSC_VER) # include <malloc.h> #endif +#ifdef _MSC_VER +# include <io.h> +#endif + /* Much better with stack allocation API */ +#ifdef _MSC_VER +# define alloca _alloca +#endif + #ifdef HAVE_ALLOCA_H -# include <alloca.h> #elif !defined(alloca) /* predefined by HP cc +Olibcalls */ void *alloca (); #endif @@ -180,6 +188,20 @@ void *alloca (); /* Make sure some common C identifiers are availble w/ Windows */ +#ifdef _MSC_VER +# define strncasecmp strnicmp +# define isatty _isatty +typedef __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +# pragma warning(disable: 4101) +#endif + /* Could be used by C++ source */ #ifdef __cplusplus @@ -207,6 +229,23 @@ void *alloca (); # undef C_varextern # define C_varextern C_extern __declspec(dllimport) # endif +# elif defined(_MSC_VER) +# undef C_fctimport +# define C_fctimport __declspec(dllexport) +# undef C_externimport +# undef C_externexport +# define C_externexport C_extern __declspec(dllexport) +# undef C_varextern +# undef C_fctexport +# ifdef C_BUILDING_LIBCHICKEN +# define C_varextern C_extern __declspec(dllexport) +# define C_fctexport __declspec(dllexport) +# define C_externimport C_extern __declspec(dllexport) +# else +# define C_varextern C_extern __declspec(dllimport) +# define C_fctexport __declspec(dllimport) +# define C_externimport C_extern __declspec(dllimport) +# endif # elif defined(__WATCOMC__) # undef C_fctimport # define C_fctimport __declspec(dllexport) @@ -243,6 +282,8 @@ void *alloca (); # if defined(__i386__) && !defined(__clang__) # define C_regparm __attribute__ ((regparm(3))) # endif +#elif defined(_MSC_VER) +# define C_fcall __fastcall #elif defined(__WATCOMC__) # define C_ccall __cdecl #endif @@ -282,6 +323,8 @@ void *alloca (); #ifdef C_ENABLE_TLS # if defined(__GNUC__) # define C_TLS __thread +# elif defined(_MSC_VER) +# define C_TLS __declspec(thread) # endif #endif @@ -502,7 +545,7 @@ static inline int isinf_ld (long double x) #define C_F32_LOCATIVE 8 #define C_F64_LOCATIVE 9 -#if defined (__MINGW32__) +#if defined(_MSC_VER) || defined (__MINGW32__) # define C_s64 __int64 # define C_u64 unsigned __int64 #else @@ -675,6 +718,8 @@ static inline int isinf_ld (long double x) #if defined(__CYGWIN__) # define C_BUILD_PLATFORM "cygwin" +#elif defined(_MSC_VER) +# define C_BUILD_PLATFORM "msvc" #elif defined(__SUNPRO_C) # define C_BUILD_PLATFORM "sun" #elif defined(__MINGW32__) @@ -973,6 +1018,11 @@ DECL_C_PROC_p0 (128, 1,0,0,0,0,0,0,0) # define C_access access # define C_getpid getpid # define C_getenv getenv +# ifdef _MSC_VER +# define C_stat _stat +# else +# define C_stat stat +# endif # ifdef __linux__ extern double round(double); extern double trunc(double); diff --git a/runtime.c b/runtime.c index 8f1949a..f7adf54 100644 --- a/runtime.c +++ b/runtime.c @@ -115,12 +115,23 @@ static C_TLS int timezone; # endif #endif -#ifdef C_HACKED_APPLY -# if defined(__MACH__) || defined(__MINGW32__) || defined(__CYGWIN__) +#ifdef _MSC_VER +# define S_IFMT _S_IFMT +# define S_IFDIR _S_IFDIR +# define timezone _timezone +# if defined(_M_IX86) +# ifndef C_HACKED_APPLY +# define C_HACKED_APPLY +# endif +# endif +#else +# ifdef C_HACKED_APPLY +# if defined(__MACH__) || defined(__MINGW32__) || defined(__CYGWIN__) extern void C_do_apply_hack(void *proc, C_word *args, int count) C_noret; -# else +# else extern void _C_do_apply_hack(void *proc, C_word *args, int count) C_noret; -# define C_do_apply_hack _C_do_apply_hack +# define C_do_apply_hack _C_do_apply_hack +# endif # endif #endif @@ -611,7 +622,7 @@ int CHICKEN_initialize(int heap, int stack, int symbols, void *toplevel) /*FIXME Should have C_tzset in chicken.h? */ #ifdef C_NONUNIX C_startup_time_seconds = (time_t)0; -# if defined(__MINGW32__) +# if defined(_MSC_VER) || defined(__MINGW32__) /* Make sure _tzname, _timezone, and _daylight are set */ _tzset(); # endif @@ -4310,7 +4321,11 @@ C_regparm C_word C_fcall C_fudge(C_word fudge_factor) return C_fix(C_trace_buffer_size); case C_fix(30): /* unused */ +#ifdef _MSC_VER + return C_fix(_MSC_VER); +#else return C_SCHEME_FALSE; +#endif case C_fix(31): /* GC time since last invocation */ tgc = timer_accumulated_gc_ms; @@ -6029,6 +6044,13 @@ void C_ccall C_apply(C_word c, C_word closure, C_word k, C_word fn, ...) buf[ 2 ] = k; C_memcpy(&buf[ 3 ], C_temporary_stack_limit, n * sizeof(C_word)); proc = (void *)C_block_item(fn2, 0); +# ifdef _MSC_VER + __asm { + mov eax, proc + mov esp, buf + call eax + } +# elif defined(__GNUC__) C_do_apply_hack(proc, buf, n + 3); #else C_do_apply(n, fn2, k); @@ -9373,7 +9395,7 @@ C_i_file_exists_p(C_word name, C_word file, C_word dir) struct stat buf; int res; - res = stat(C_c_string(name), &buf); + res = C_stat(C_c_string(name), &buf); if(res != 0) { switch(errno) {
_______________________________________________ Chicken-users mailing list Chicken-users@nongnu.org https://lists.nongnu.org/mailman/listinfo/chicken-users