[Numpy-svn] r5542 - in trunk/tools/win32build: . cpucaps

numpy-svn@scip... numpy-svn@scip...
Sat Jul 26 01:29:13 CDT 2008


Author: cdavid
Date: 2008-07-26 01:29:08 -0500 (Sat, 26 Jul 2008)
New Revision: 5542

Added:
   trunk/tools/win32build/cpucaps/
   trunk/tools/win32build/cpucaps/SConstruct
   trunk/tools/win32build/cpucaps/cpucaps_main.c
   trunk/tools/win32build/cpucaps/cpucaps_main.h
Log:
Add cpu_caps nsis plugin sources (to detect SSE in nsis scripts).

Added: trunk/tools/win32build/cpucaps/SConstruct
===================================================================
--- trunk/tools/win32build/cpucaps/SConstruct	2008-07-26 06:13:42 UTC (rev 5541)
+++ trunk/tools/win32build/cpucaps/SConstruct	2008-07-26 06:29:08 UTC (rev 5542)
@@ -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)

Added: trunk/tools/win32build/cpucaps/cpucaps_main.c
===================================================================
--- trunk/tools/win32build/cpucaps/cpucaps_main.c	2008-07-26 06:13:42 UTC (rev 5541)
+++ trunk/tools/win32build/cpucaps/cpucaps_main.c	2008-07-26 06:29:08 UTC (rev 5542)
@@ -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;
+}

Added: trunk/tools/win32build/cpucaps/cpucaps_main.h
===================================================================
--- trunk/tools/win32build/cpucaps/cpucaps_main.h	2008-07-26 06:13:42 UTC (rev 5541)
+++ trunk/tools/win32build/cpucaps/cpucaps_main.h	2008-07-26 06:29:08 UTC (rev 5542)
@@ -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_



More information about the Numpy-svn mailing list