diff options
author | David Cournapeau <cournape@gmail.com> | 2008-07-26 06:29:08 +0000 |
---|---|---|
committer | David Cournapeau <cournape@gmail.com> | 2008-07-26 06:29:08 +0000 |
commit | e1bc01faf6ffba5dab7587a97f967ca1bdee9fb2 (patch) | |
tree | f35427246d316bd260b41d42fd989c48a605bf67 /tools | |
parent | 1fddb21cdd90e458c84d26d93e01ca12b2e5e4b7 (diff) | |
download | numpy-e1bc01faf6ffba5dab7587a97f967ca1bdee9fb2.tar.gz |
Add cpu_caps nsis plugin sources (to detect SSE in nsis scripts).
Diffstat (limited to 'tools')
-rw-r--r-- | tools/win32build/cpucaps/SConstruct | 8 | ||||
-rw-r--r-- | tools/win32build/cpucaps/cpucaps_main.c | 108 | ||||
-rw-r--r-- | tools/win32build/cpucaps/cpucaps_main.h | 128 |
3 files changed, 244 insertions, 0 deletions
diff --git a/tools/win32build/cpucaps/SConstruct b/tools/win32build/cpucaps/SConstruct new file mode 100644 index 000000000..7a0f481b6 --- /dev/null +++ b/tools/win32build/cpucaps/SConstruct @@ -0,0 +1,8 @@ +env = Environment(tools = ['mingw']) + +env.Append(CPPPATH = ['../cpuid']) +env.Append(CFLAGS = ['-W', '-Wall']) +cpuplug = env.SharedLibrary('cpucaps', source = ['cpucaps_main.c', '../cpuid/cpuid.c']) + +cpuplug_install = env.InstallAs('C:\Program Files\NSIS\Plugins\CpuCaps.dll', cpuplug[0]) +env.Alias('install', cpuplug_install) diff --git a/tools/win32build/cpucaps/cpucaps_main.c b/tools/win32build/cpucaps/cpucaps_main.c new file mode 100644 index 000000000..1c52749a8 --- /dev/null +++ b/tools/win32build/cpucaps/cpucaps_main.c @@ -0,0 +1,108 @@ +#include <stdio.h> + +#include <windows.h> +#include "cpucaps_main.h" + +#include "cpuid.h" + +HINSTANCE g_hInstance; + +HWND g_hwndParent; + +#define CPUID_FAILED "Unknown" + +/* + * if val is true, str is the "Y" string, otherwise the "N" string + */ +static int _set_bool_str(int val, char* str) +{ + if (val) { + str[0] = 'Y'; + } else { + str[0] = 'N'; + } + str[1] = '\0'; + + return 0; +} + +void __declspec(dllexport) hasSSE3(HWND hwndParent, int string_size, + char *variables, stack_t **stacktop, + extra_parameters *extra) +{ + cpu_caps_t *cpu; + char has_sse3[2]; + + //g_hwndParent=hwndParent; + + EXDLL_INIT(); + + + // note if you want parameters from the stack, pop them off in order. + // i.e. if you are called via exdll::myFunction file.dat poop.dat + // calling popstring() the first time would give you file.dat, + // and the second time would give you poop.dat. + // you should empty the stack of your parameters, and ONLY your + // parameters. + + // do your stuff here + cpu = malloc(sizeof(*cpu)); + if (cpu == NULL) { + fprintf(stderr, "malloc call failed\n"); + _set_bool_str(0, has_sse3); + goto push_vars; + } + cpuid_get_caps(cpu); + _set_bool_str(cpu->has_sse3, has_sse3); + + +push_vars: + pushstring(has_sse3); + + return ; +} + + +void __declspec(dllexport) hasSSE2(HWND hwndParent, int string_size, + char *variables, stack_t **stacktop, + extra_parameters *extra) +{ + cpu_caps_t *cpu; + char has_sse2[2]; + + //g_hwndParent=hwndParent; + + EXDLL_INIT(); + + + // note if you want parameters from the stack, pop them off in order. + // i.e. if you are called via exdll::myFunction file.dat poop.dat + // calling popstring() the first time would give you file.dat, + // and the second time would give you poop.dat. + // you should empty the stack of your parameters, and ONLY your + // parameters. + + // do your stuff here + cpu = malloc(sizeof(*cpu)); + if (cpu == NULL) { + fprintf(stderr, "malloc call failed\n"); + _set_bool_str(0, has_sse2); + goto push_vars; + } + cpuid_get_caps(cpu); + _set_bool_str(cpu->has_sse2, has_sse2); + + +push_vars: + pushstring(has_sse2); + + return ; +} + + + +BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) +{ + g_hInstance=hInst; + return TRUE; +} diff --git a/tools/win32build/cpucaps/cpucaps_main.h b/tools/win32build/cpucaps/cpucaps_main.h new file mode 100644 index 000000000..661bf17ea --- /dev/null +++ b/tools/win32build/cpucaps/cpucaps_main.h @@ -0,0 +1,128 @@ +#ifndef _EXDLL_H_ +#define _EXDLL_H_ + +#include <windows.h> + +#if defined(__GNUC__) +#define UNUSED __attribute__((unused)) +#else +#define UNUSED +#endif + +// only include this file from one place in your DLL. +// (it is all static, if you use it in two places it will fail) + +#define EXDLL_INIT() { \ + g_stringsize=string_size; \ + g_stacktop=stacktop; \ + g_variables=variables; } + +// For page showing plug-ins +#define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8) +#define WM_NOTIFY_CUSTOM_READY (WM_USER+0xd) +#define NOTIFY_BYE_BYE 'x' + +typedef struct _stack_t { + struct _stack_t *next; + char text[1]; // this should be the length of string_size +} stack_t; + + +static unsigned int g_stringsize; +static stack_t **g_stacktop; +static char *g_variables; + +static int __stdcall popstring(char *str) UNUSED; // 0 on success, 1 on empty stack +static void __stdcall pushstring(const char *str) UNUSED; +static char * __stdcall getuservariable(const int varnum) UNUSED; +static void __stdcall setuservariable(const int varnum, const char *var) UNUSED; + +enum +{ +INST_0, // $0 +INST_1, // $1 +INST_2, // $2 +INST_3, // $3 +INST_4, // $4 +INST_5, // $5 +INST_6, // $6 +INST_7, // $7 +INST_8, // $8 +INST_9, // $9 +INST_R0, // $R0 +INST_R1, // $R1 +INST_R2, // $R2 +INST_R3, // $R3 +INST_R4, // $R4 +INST_R5, // $R5 +INST_R6, // $R6 +INST_R7, // $R7 +INST_R8, // $R8 +INST_R9, // $R9 +INST_CMDLINE, // $CMDLINE +INST_INSTDIR, // $INSTDIR +INST_OUTDIR, // $OUTDIR +INST_EXEDIR, // $EXEDIR +INST_LANG, // $LANGUAGE +__INST_LAST +}; + +typedef struct { + int autoclose; + int all_user_var; + int exec_error; + int abort; + int exec_reboot; + int reboot_called; + int XXX_cur_insttype; // deprecated + int XXX_insttype_changed; // deprecated + int silent; + int instdir_error; + int rtl; + int errlvl; + int alter_reg_view; +} exec_flags_type; + +typedef struct { + exec_flags_type *exec_flags; + int (__stdcall *ExecuteCodeSegment)(int, HWND); + void (__stdcall *validate_filename)(char *); +} extra_parameters; + +// utility functions (not required but often useful) +static int __stdcall popstring(char *str) +{ + stack_t *th; + if (!g_stacktop || !*g_stacktop) return 1; + th=(*g_stacktop); + lstrcpyA(str,th->text); + *g_stacktop = th->next; + GlobalFree((HGLOBAL)th); + return 0; +} + +static void __stdcall pushstring(const char *str) +{ + stack_t *th; + if (!g_stacktop) return; + th=(stack_t*)GlobalAlloc(GPTR,sizeof(stack_t)+g_stringsize); + lstrcpynA(th->text,str,g_stringsize); + th->next=*g_stacktop; + *g_stacktop=th; +} + +static char * __stdcall getuservariable(const int varnum) +{ + if (varnum < 0 || varnum >= __INST_LAST) return NULL; + return g_variables+varnum*g_stringsize; +} + +static void __stdcall setuservariable(const int varnum, const char *var) +{ + if (var != NULL && varnum >= 0 && varnum < __INST_LAST) + lstrcpyA(g_variables + varnum*g_stringsize, var); +} + + + +#endif//_EXDLL_H_ |