home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mitsch75.zip / scheme-7_5_17-src.zip / scheme-7.5.17 / src / microcode / ntfile.c < prev    next >
C/C++ Source or Header  |  1999-01-02  |  4KB  |  135 lines

  1. /* -*-C-*-
  2.  
  3. $Id: ntfile.c,v 1.13 1999/01/02 06:11:34 cph Exp $
  4.  
  5. Copyright (c) 1992-1999 Massachusetts Institute of Technology
  6.  
  7. This program is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2 of the License, or (at
  10. your option) any later version.
  11.  
  12. This program is distributed in the hope that it will be useful, but
  13. WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15. General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with this program; if not, write to the Free Software
  19. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21.  
  22. #include "nt.h"
  23. #include "osfile.h"
  24. #include "ntio.h"
  25.  
  26. #define DEFUN_OPEN_FILE(name, args)                    \
  27. Tchannel                                \
  28. name (const char * filename)                        \
  29. {                                    \
  30.   HANDLE hFile;                                \
  31.   STD_HANDLE_API_CALL (hFile, CreateFile, args);            \
  32.   return (NT_open_handle (hFile));                    \
  33. }
  34.  
  35. // In the following we specify FILE_SHARE_READ | FILE_SHARE_WRITE
  36. // so that we can edit and save out a file while we are still in a
  37. // error REPL from a buggy source file.
  38.  
  39. DEFUN_OPEN_FILE (OS_open_input_file,
  40.   (filename, GENERIC_READ, (FILE_SHARE_READ | FILE_SHARE_WRITE), 0,
  41.    OPEN_EXISTING, (FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN), 0));
  42.  
  43. DEFUN_OPEN_FILE (OS_open_output_file,
  44.   (filename, GENERIC_WRITE, FILE_SHARE_READ, 0,
  45.    CREATE_ALWAYS, (FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN), 0));
  46.  
  47. DEFUN_OPEN_FILE (OS_open_io_file,
  48.   (filename, (GENERIC_READ | GENERIC_WRITE),
  49.    (FILE_SHARE_READ | FILE_SHARE_WRITE), 0,
  50.    OPEN_ALWAYS, (FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS), 0));
  51.  
  52. Tchannel
  53. OS_open_append_file (const char * filename)
  54. {
  55.   HANDLE hFile;
  56.   STD_HANDLE_API_CALL
  57.     (hFile,
  58.      CreateFile, (filename,
  59.               GENERIC_WRITE,
  60.           FILE_SHARE_READ    /*sharing*/,
  61.           0,            /*security*/
  62.           OPEN_ALWAYS,
  63.           FILE_ATTRIBUTE_NORMAL /*attributes&flags*/,
  64.           0            /*Template*/
  65.           ));
  66.   if ((SetFilePointer (hFile, 0, 0, FILE_END)) == 0xFFFFFFFF)
  67.     NT_error_api_call ((GetLastError ()), apicall_SetFilePointer);
  68.   return (NT_open_handle (hFile));
  69. }
  70.  
  71. static Tchannel
  72. make_load_channel (HANDLE handle)
  73. {
  74.   channel_class_t * class = (NT_handle_channel_class (handle));
  75.   return
  76.     ((((CHANNEL_CLASS_TYPE (class)) == channel_type_terminal)
  77.       || ((CHANNEL_CLASS_TYPE (class)) == channel_type_directory))
  78.      ? NO_CHANNEL
  79.      : (NT_make_channel (handle, class)));
  80. }
  81.  
  82. Tchannel
  83. OS_open_load_file (const char * filename)
  84. {
  85.   HANDLE handle
  86.     = (CreateFile (filename, GENERIC_READ, FILE_SHARE_READ, 0,
  87.            OPEN_EXISTING, 0, 0));
  88.   return
  89.     ((handle != INVALID_HANDLE_VALUE)
  90.      ? (make_load_channel (handle))
  91.      : NO_CHANNEL);
  92. }
  93.  
  94. Tchannel
  95. OS_open_dump_file (const char * filename)
  96. {
  97.   HANDLE handle
  98.     = (CreateFile (filename, GENERIC_WRITE, FILE_SHARE_READ, 0,
  99.            CREATE_ALWAYS, 0, 0));
  100.   return
  101.     ((handle != INVALID_HANDLE_VALUE)
  102.      ? (make_load_channel (handle))
  103.      : NO_CHANNEL);
  104. }
  105.  
  106. off_t
  107. OS_file_length (Tchannel channel)
  108. {
  109.   DWORD result = (GetFileSize ((CHANNEL_HANDLE (channel)), 0));
  110.   if (result == 0xFFFFFFFF)
  111.     NT_error_api_call ((GetLastError ()), apicall_GetFileSize);
  112.   return (result);
  113. }
  114.  
  115. off_t
  116. OS_file_position (Tchannel channel)
  117. {
  118.   DWORD position
  119.     = (SetFilePointer ((CHANNEL_HANDLE (channel)), 0, 0, FILE_CURRENT));
  120.   if (position == 0xFFFFFFFF)
  121.     NT_error_api_call ((GetLastError ()), apicall_SetFilePointer);
  122.   return (position);
  123. }
  124.  
  125. void
  126. OS_file_set_position (Tchannel channel, off_t position)
  127. {
  128.   DWORD old_position
  129.     = (SetFilePointer ((CHANNEL_HANDLE (channel)), position, 0, FILE_BEGIN));
  130.   if (old_position == 0xFFFFFFFF)
  131.     NT_error_api_call ((GetLastError ()), apicall_SetFilePointer);
  132.   if (old_position != ((DWORD) position))
  133.     error_external_return ();
  134. }
  135.