stoddard    99/09/30 14:10:18

  Modified:    src/lib/apr/file_io/win32 readwrite.c
  Log:
  Win32: Implement ap_ungetc()
  
  Revision  Changes    Path
  1.3       +38 -0     apache-2.0/src/lib/apr/file_io/win32/readwrite.c
  
  Index: readwrite.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/win32/readwrite.c,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- readwrite.c       1999/09/24 18:49:03     1.2
  +++ readwrite.c       1999/09/30 21:10:15     1.3
  @@ -60,6 +60,8 @@
   #include "apr_errno.h"
   #include <windows.h>
   
  +#define GetFilePointer(hfile) SetFilePointer(hfile,0,NULL, FILE_CURRENT)
  +
   ap_status_t ap_read(struct file_t *thefile, void *buf, ap_ssize_t *nbytes)
   {
       DWORD bread;
  @@ -131,6 +133,42 @@
       if (!WriteFile(thefile->filehand, &ch, 1, &bwrote, NULL)) {
           return APR_EEXIST;
       }
  +    return APR_SUCCESS; 
  +}
  +
  +ap_status_t ap_ungetc(ap_file_t *thefile, char ch)
  +{
  +    /* 
  +     * Your application must provide its own serialization (locking) if
  +     * it allows multiple threads to access the same file handle 
  +     * concurrently.
  +     *
  +     * ToDo: This function does not use the char ch argument. Could add 
  +     * gorpy code to read the file after the SetFilePointer() call to 
  +     * make sure the character pushed back on the stream is the same as
  +     * arg ch. Then, need to SetFilePointer() once more to reset the 
  +     * file pointer to the point before the read. Yech... Just assume 
  +     * the caller knows what he is doing.  There may be a nifty Win32 
  +     * call for this I've not discovered....
  +     */
  +
  +    /* SetFilePointer is only valid for a file device ...*/
  +    if (GetFileType(thefile->filehand) != FILE_TYPE_DISK) {
  +        return !APR_SUCCESS; /* is there no generic failure code? */
  +    }
  +    /* that's buffered... */
  +    if (!thefile->buffered) {
  +        return !APR_SUCCESS; /* is there no generic failure code? */
  +    }
  +    /* and the file pointer is not pointing to the start of the file. */
  +    if (GetFilePointer(thefile->filehand)) {
  +        if (SetFilePointer(thefile->filehand, -1, NULL, FILE_CURRENT) 
  +            == 0xFFFFFFFF) {
  +            return !APR_SUCCESS;
  +        }
  +    }
  +
  +    thefile->stated = 0;
       return APR_SUCCESS; 
   }
   
  
  
  

Reply via email to