[gambit-list] null device on windows
Marc Feeley
feeley at iro.umontreal.ca
Mon Apr 15 12:29:16 EDT 2013
On 2013-04-12, at 6:29 PM, Ralph Moritz <ralph.moeritz at outlook.com> wrote:
> On Unix the null device is /dev/null. On Windows NT+ the equivalent is
> NUL. We can verify this by writing the following small C++11 program:
>
> #include <cstdio>
> int main() {
> auto f = fopen("NUL", "r");
> if (f == nullptr) {
> fprintf(stderr, "Cannot open file `NUL'.");
> return 0;
> }
> printf("Opened file `NUL' successfully.");
> }
>
> The above program, when compiled and run on Windows, will always print
> "Opened file `NUL' successfully."
>
> This brings me to Gambit, via Black Hole. BH contains some code (in
> compile-load.scm and lib.scm) that assumes `/dev/null' exists. This is
> obviously not true on Windows where instead we have `NUL'. It's easy
> enough to modify BH accordingly but the problem remains that Gambit
> tries to normalize all paths passed to `compile-file-to-target' so we
> end up with `<absolute path to cwd>\NUL' instead of just `NUL'. This
> essentially prevents us from using the null device as input to
> `compile-file-to-target' on Windows & means the following code from BH
> will fail on Windows:
>
> (define (compile-sexp-to-c sexp
> fn
> #!key
> (options '()))
> (##gc) ;; Avoid out-of-memory related crashes
> (let ((hook (lambda (_) sexp))
> (prev-hook #f))
> (dynamic-wind
> (lambda ()
> (set! prev-hook c#expand-source)
> (set! c#expand-source hook))
> (lambda ()
> (compile-file-to-target "/dev/null" ;; Change to "NUL" on Windows
> output: fn
> options: options))
> (lambda ()
> (set! c#expand-source prev-hook)))))
>
> I've searched through the Gambit source code & tried to make the
> necessary changes to get this working but have been unable to do so. I
> probably just don't yet have a good enough understanding of the
> code. (I tried modifying ___os_path_normalize_directory in
> lib/os_files.c)
>
> Is anyone able to help with this? I really want to run Black Hole on Windows!
There was an issue with opening UNC filenames (Universal Naming Convention) on Windows that I have now fixed. So now it is possible to use \\.\nul for the nul device (so "/dev/null" should be replaced with "\\\\.\\nul" on Windows). Note that the path-expansion algorithm will map "nul" to "<cwd>/nul" so a (open-output-file "nul") will open a local file called "nul". This consistency with Unix is a good thing.
Marc
More information about the Gambit-list
mailing list