0.9.9.31:
[sbcl.git] / src / runtime / win32-os.c
index c1bf6a2..8ec02db 100644 (file)
@@ -38,6 +38,7 @@
 #include "interrupt.h"
 #include "interr.h"
 #include "lispregs.h"
+#include "runtime.h"
 #include "monitor.h"
 #include "alloc.h"
 #include "genesis/primitive-objects.h"
@@ -581,6 +582,28 @@ void *memcpy(void *dest, const void *src, size_t n)
     return dest;
 }
 
+char *dirname(char *path)
+{
+    static char buf[PATH_MAX + 1];
+    size_t pathlen = strlen(path);
+    int i;
+
+    if (pathlen >= sizeof(buf)) {
+        lose("Pathname too long in dirname.\n");
+        return NULL;
+    }
+
+    strcpy(buf, path);
+    for (i = pathlen; i >= 0; --i) {
+        if (buf[i] == '/' || buf[i] == '\\') {
+            buf[i] = '\0';
+            break;
+        }
+    }
+
+    return buf;
+}
+
 /* This is a manually-maintained version of ldso_stubs.S. */
 
 void scratch(void)
@@ -598,9 +621,34 @@ void scratch(void)
     dup(0);
     LoadLibrary(0);
     GetProcAddress(0, 0);
+    FreeLibrary(0);
     mkdir(0);
     isatty(0);
-    access(0,0)
+    access(0,0);
+    GetLastError();
+    FormatMessageA(0, 0, 0, 0, 0, 0, 0);
+    _get_osfhandle(0);
+    ReadFile(0, 0, 0, 0, 0);
+    WriteFile(0, 0, 0, 0, 0);
+    PeekNamedPipe(0, 0, 0, 0, 0, 0);
+    FlushConsoleInputBuffer(0);
+    PeekConsoleInput(0, 0, 0, 0);
+    Sleep(0);
+}
+
+char *
+os_get_runtime_executable_path()
+{
+    char path[MAX_PATH + 1];
+    DWORD bufsize = sizeof(path);
+    DWORD size;
+
+    if ((size = GetModuleFileNameA(NULL, path, bufsize)) == 0)
+        return NULL;
+    else if (size == bufsize && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
+        return NULL;
+
+    return copied_string(path);
 }
 
 /* EOF */