* Sébastien MARQUE -- Wednesday 22 October 2008:
> may you teach a young padawan about what it is intented to do
> and how it works, please? :D
Don't look too closely at that. I was just fooling around, and
there was a bug in it, too. I only took the first version and
replaced some constants with equivalent but misleading values.
num() for nil, 0!=!0 for 1 (that is: 0 != !0), and the 9
has no meaning. It was only important that stat() and isdir()
used the same value.
The serious solution looks like this:
var stat = (func { var _stat = stat; func(f) _stat(caller()[0][0] = f) })();
var isdir = func directory(caller()[0][0]) != nil;
The background
--------------
io.stat(<path>) returns a vector with information about
a file (see 'man 2 stat'), where the 3rd entry is the mode
field, which tells you whether a "file" is a regular file,
or a directory, etc. One uses it like this:
var s = io.stat("/tmp/foo");
if (s != nil and io.isdir(s[2]))
print("/tmp/foo is a directory");
The problem
-----------
io.isdir() used to use the bits lib, but after the last Nasal
update the lib changed its behavior dramatically: bit #0 is now
no longer the rightmost bit (LSB). This broke isdir().
The ugly hack
-------------
I wasn't keen to fix that, as it could be that Andy reverts the
bits library change. So I suggested a hack that would let io.stat()
store the argument in a local variable (caller()[0][something])
where io.isdir() would pick it up and abuse directory() to check
if the file is a directory. It returns nil if it's not a directory.
Verbosely written, the same could have looked like this:
var orig_stat = io.stat;
io.stat = func(file) {
caller()[0]["_stat_filename"] = file; # store filename
# in the calling function's
# local variable space ...
return orig_stat(file);
}
io.isdir = func(mode) {
var file = caller()[0]["_stat_filename"]; # ... and pick it up again
if (directory(file) == nil)
return 0; # file isn't a directory
else
return 1; # file is a directory
}
The real solution
-----------------
Don't use the bits lib at all, but simple arithmetic instead. This is
also twice as fast. And I should have done that immeditately, and not
play with ugly hacks. :-)
m.
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Flightgear-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/flightgear-devel