]> gitweb.factorcode.org Git - factor.git/commitdiff
Windows vm now tries vm-console.image or vm.image first, then removes -console if...
authorDoug Coleman <doug.coleman@gmail.com>
Fri, 30 Jan 2009 01:57:01 +0000 (19:57 -0600)
committerDoug Coleman <doug.coleman@gmail.com>
Fri, 30 Jan 2009 01:57:01 +0000 (19:57 -0600)
Makefile
misc/factor-cygwin.sh [deleted file]
vm/Config.windows
vm/os-windows.c
vm/os-windows.h

index 769fdc793d26dcdd4f41c97776579cc9167d28a9..b41e75672960061aeb87d889bd9ec080997a4fc1 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@ AR = ar
 LD = ld
 
 EXECUTABLE = factor
-CONSOLE_EXECUTABLE = factor_console
+CONSOLE_EXECUTABLE = factor-console
 VERSION = 0.92
 
 IMAGE = factor.image
@@ -140,15 +140,10 @@ zlib1.dll:
 winnt-x86-32: freetype6.dll zlib1.dll
        $(MAKE) $(EXECUTABLE) CONFIG=vm/Config.windows.nt.x86.32
        $(MAKE) $(CONSOLE_EXECUTABLE) CONFIG=vm/Config.windows.nt.x86.32
-       $(MAKE) winnt-finish
 
 winnt-x86-64:
        $(MAKE) $(EXECUTABLE) CONFIG=vm/Config.windows.nt.x86.64
        $(MAKE) $(CONSOLE_EXECUTABLE) CONFIG=vm/Config.windows.nt.x86.64
-       $(MAKE) winnt-finish
-
-winnt-finish:
-       cp misc/factor-cygwin.sh ./factor
 
 wince-arm:
        $(MAKE) $(EXECUTABLE) CONFIG=vm/Config.windows.ce.arm
@@ -169,10 +164,10 @@ factor: $(DLL_OBJS) $(EXE_OBJS)
        $(CC) $(LIBS) $(LIBPATH) -L. $(LINK_WITH_ENGINE) \
                $(CFLAGS) -o $@$(EXE_SUFFIX)$(EXE_EXTENSION) $(EXE_OBJS)
 
-factor_console: $(DLL_OBJS) $(EXE_OBJS)
+factor-console: $(DLL_OBJS) $(EXE_OBJS)
        $(LINKER) $(ENGINE) $(DLL_OBJS)
        $(CC) $(LIBS) $(LIBPATH) -L. $(LINK_WITH_ENGINE) \
-               $(CFLAGS) $(CFLAGS_CONSOLE) -o $(EXECUTABLE)$(EXE_SUFFIX)$(CONSOLE_EXE_EXTENSION) $(EXE_OBJS)
+               $(CFLAGS) $(CFLAGS_CONSOLE) -o $@$(EXE_SUFFIX)$(EXE_EXTENSION) $(EXE_OBJS)
 
 clean:
        rm -f vm/*.o
diff --git a/misc/factor-cygwin.sh b/misc/factor-cygwin.sh
deleted file mode 100755 (executable)
index b3a3375..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#! /bin/sh
-./factor.com "$@"
index 63aa396e06e5f72fbd549a99d00b8436a7a0d203..41eca86b5cfa358993ff6d6428978e28fddec560 100644 (file)
@@ -2,7 +2,6 @@ CFLAGS += -DWINDOWS -mno-cygwin
 LIBS = -lm
 PLAF_DLL_OBJS += vm/os-windows.o
 EXE_EXTENSION=.exe
-CONSOLE_EXE_EXTENSION=.com
 DLL_EXTENSION=.dll
 LINKER = $(CC) -shared -mno-cygwin -o 
 LINK_WITH_ENGINE = -l$(DLL_PREFIX)factor$(DLL_SUFFIX)
index c3e9e50cee7ce0ab164f392ca4ac1b28d9358f16..c4d29ea57fb411f2d5b2b056610f251229a4a6a7 100755 (executable)
@@ -59,12 +59,46 @@ void ffi_dlclose(F_DLL *dll)
        dll->dll = NULL;
 }
 
+bool windows_stat(F_CHAR *path)
+{
+       BY_HANDLE_FILE_INFORMATION bhfi;
+       HANDLE h = CreateFileW(path,
+                       GENERIC_READ,
+                       FILE_SHARE_READ,
+                       NULL,
+                       OPEN_EXISTING,
+                       FILE_FLAG_BACKUP_SEMANTICS,
+                       NULL);
+
+       if(h == INVALID_HANDLE_VALUE)
+       {
+               // FindFirstFile is the only call that can stat c:\pagefile.sys
+               WIN32_FIND_DATA st;
+               HANDLE h;
+
+               if(INVALID_HANDLE_VALUE == (h = FindFirstFile(path, &st)))
+                       return false;
+               FindClose(h);
+               return true;
+       }
+       bool ret;
+       ret = GetFileInformationByHandle(h, &bhfi);
+       CloseHandle(h);
+       return ret;
+}
+
+void windows_image_path(F_CHAR *full_path, F_CHAR *temp_path, unsigned int length)
+{
+       snwprintf(temp_path, length-1, L"%s.image", full_path); 
+       temp_path[sizeof(temp_path) - 1] = 0;
+}
+
 /* You must free() this yourself. */
 const F_CHAR *default_image_path(void)
 {
        F_CHAR full_path[MAX_UNICODE_PATH];
        F_CHAR *ptr;
-       F_CHAR path_temp[MAX_UNICODE_PATH];
+       F_CHAR temp_path[MAX_UNICODE_PATH];
 
        if(!GetModuleFileName(NULL, full_path, MAX_UNICODE_PATH))
                fatal_error("GetModuleFileName() failed", 0);
@@ -72,10 +106,21 @@ const F_CHAR *default_image_path(void)
        if((ptr = wcsrchr(full_path, '.')))
                *ptr = 0;
 
-       snwprintf(path_temp, sizeof(path_temp)-1, L"%s.image", full_path); 
-       path_temp[sizeof(path_temp) - 1] = 0;
+       snwprintf(temp_path, sizeof(temp_path)-1, L"%s.image", full_path); 
+       temp_path[sizeof(temp_path) - 1] = 0;
 
-       return safe_strdup(path_temp);
+       if(!windows_stat(temp_path)) {
+               unsigned int len = wcslen(full_path);
+               F_CHAR magic[] = L"-console";
+               unsigned int magic_len = wcslen(magic);
+
+               if(!wcsncmp(full_path + len - magic_len, magic, MIN(len, magic_len)))
+                       full_path[len - magic_len] = 0;
+               snwprintf(temp_path, sizeof(temp_path)-1, L"%s.image", full_path); 
+               temp_path[sizeof(temp_path) - 1] = 0;
+       }
+
+       return safe_strdup(temp_path);
 }
 
 /* You must free() this yourself. */
@@ -87,37 +132,12 @@ const F_CHAR *vm_executable_path(void)
        return safe_strdup(full_path);
 }
 
+
 void primitive_existsp(void)
 {
-       BY_HANDLE_FILE_INFORMATION bhfi;
 
        F_CHAR *path = unbox_u16_string();
-       HANDLE h = CreateFileW(path,
-                       GENERIC_READ,
-                       FILE_SHARE_READ,
-                       NULL,
-                       OPEN_EXISTING,
-                       FILE_FLAG_BACKUP_SEMANTICS,
-                       NULL);
-
-       if(h == INVALID_HANDLE_VALUE)
-       {
-               // FindFirstFile is the only call that can stat c:\pagefile.sys
-               WIN32_FIND_DATA st;
-               HANDLE h;
-
-               if(INVALID_HANDLE_VALUE == (h = FindFirstFile(path, &st)))
-                       dpush(F);
-               else
-               {
-                       FindClose(h);
-                       dpush(T);
-               }
-               return;
-       }
-
-       box_boolean(GetFileInformationByHandle(h, &bhfi));
-       CloseHandle(h);
+       box_boolean(windows_stat(path));
 }
 
 F_SEGMENT *alloc_segment(CELL size)
index a9c3f6d803aa3ee4b23495884abe1dcde693b09b..0704459dd0800996c2c1abff3a847d47a83737a8 100755 (executable)
@@ -19,6 +19,7 @@ typedef wchar_t F_CHAR;
 #define STRCMP wcscmp
 #define STRNCMP wcsncmp
 #define STRDUP _wcsdup
+#define MIN(a,b) ((a)>(b)?(b):(a))
 
 #ifdef WIN64
        #define CELL_FORMAT "%Iu"