| DOS treats the first 5 file handles as special cases. They map directly | |
| to stdin, stdout, stderr, stdaux and stdprn. Windows 16 inherits this | |
| behavoir, and in fact, win16 handles are interchangable with DOS handles. | |
| Some nasty windows programs even do this! | |
| Windows32 issues file handles starting from 1, on the grounds that | |
| most GUI processes don't need a stdin, out, etc. | |
| The wine handle code is implemented in the Win32 style, and the Win16 | |
| functions use two macros to convert to and from the two types. | |
| The macros are defined in file.h as follows.: | |
| #define HFILE16_TO_HFILE32(handle) \ | |
| (((handle)==0) ? GetStdHandle(STD_INPUT_HANDLE) : \ | |
| ((handle)==1) ? GetStdHandle(STD_OUTPUT_HANDLE) : \ | |
| ((handle)==2) ? GetStdHandle(STD_ERROR_HANDLE) : \ | |
| ((handle)>0x400) ? handle : \ | |
| (handle)-5) | |
| #define HFILE32_TO_HFILE16(handle) ({ HFILE32 hnd=handle; \ | |
| ((hnd==HFILE_ERROR32) ? HFILE_ERROR16 : \ | |
| ((handle>0x400) ? handle : \ | |
| (HFILE16)hnd+5); }) | |
| WARNING: be careful not to use the macro HFILE16_TO_HFILE32 on | |
| functions with side-effects, as it will cause them to be evaluated | |
| several times. This could be considered a bug, but the use of this | |
| macro is limited enough not to need a rewrite. | |
| NOTE: The 0x400 special case above deals with LZW filehandles (see | |
| misc/lzexpand.c). |