You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by bj...@apache.org on 2010/04/04 15:10:35 UTC

svn commit: r930686 - in /apr/apr/trunk: file_io/os2/filedup.c file_io/os2/open.c file_io/os2/pipe.c file_io/os2/readwrite.c include/arch/os2/apr_arch_file_io.h

Author: bjh
Date: Sun Apr  4 13:10:34 2010
New Revision: 930686

URL: http://svn.apache.org/viewvc?rev=930686&view=rev
Log:
OS/2: Do a proper implementation of apr_file_ungetc().

Modified:
    apr/apr/trunk/file_io/os2/filedup.c
    apr/apr/trunk/file_io/os2/open.c
    apr/apr/trunk/file_io/os2/pipe.c
    apr/apr/trunk/file_io/os2/readwrite.c
    apr/apr/trunk/include/arch/os2/apr_arch_file_io.h

Modified: apr/apr/trunk/file_io/os2/filedup.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/file_io/os2/filedup.c?rev=930686&r1=930685&r2=930686&view=diff
==============================================================================
--- apr/apr/trunk/file_io/os2/filedup.c (original)
+++ apr/apr/trunk/file_io/os2/filedup.c Sun Apr  4 13:10:34 2010
@@ -49,6 +49,7 @@ static apr_status_t file_dup(apr_file_t 
     dup_file->buffered = old_file->buffered;
     dup_file->isopen = old_file->isopen;
     dup_file->flags = old_file->flags & ~APR_INHERIT;
+    dup_file->ungetchar = old_file->ungetchar;
     /* TODO - dup pipes correctly */
     dup_file->pipe = old_file->pipe;
 

Modified: apr/apr/trunk/file_io/os2/open.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/file_io/os2/open.c?rev=930686&r1=930685&r2=930686&view=diff
==============================================================================
--- apr/apr/trunk/file_io/os2/open.c (original)
+++ apr/apr/trunk/file_io/os2/open.c Sun Apr  4 13:10:34 2010
@@ -44,6 +44,7 @@ APR_DECLARE(apr_status_t) apr_file_open(
     dafile->buffer = NULL;
     dafile->flags = flag;
     dafile->blocking = BLK_ON;
+    dafile->ungetchar = -1;
     
     if ((flag & APR_FOPEN_READ) && (flag & APR_FOPEN_WRITE)) {
         mflags |= OPEN_ACCESS_READWRITE;
@@ -199,6 +200,7 @@ APR_DECLARE(apr_status_t) apr_os_file_pu
     (*file)->flags = flags;
     (*file)->pipe = FALSE;
     (*file)->buffered = (flags & APR_FOPEN_BUFFERED) > 0;
+    (*file)->ungetchar = -1;
 
     if ((*file)->buffered) {
         apr_status_t rv;

Modified: apr/apr/trunk/file_io/os2/pipe.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/file_io/os2/pipe.c?rev=930686&r1=930685&r2=930686&view=diff
==============================================================================
--- apr/apr/trunk/file_io/os2/pipe.c (original)
+++ apr/apr/trunk/file_io/os2/pipe.c Sun Apr  4 13:10:34 2010
@@ -85,6 +85,7 @@ APR_DECLARE(apr_status_t) apr_file_pipe_
     (*in)->pipe = 1;
     (*in)->timeout = -1;
     (*in)->blocking = BLK_ON;
+    (*in)->ungetchar = -1;
     apr_pool_cleanup_register(pool, *in, apr_file_cleanup, apr_pool_cleanup_null);
 
     (*out) = (apr_file_t *)apr_palloc(pool, sizeof(apr_file_t));
@@ -97,6 +98,7 @@ APR_DECLARE(apr_status_t) apr_file_pipe_
     (*out)->pipe = 1;
     (*out)->timeout = -1;
     (*out)->blocking = BLK_ON;
+    (*out)->ungetchar = -1;
     apr_pool_cleanup_register(pool, *out, apr_file_cleanup, apr_pool_cleanup_null);
 
     return APR_SUCCESS;
@@ -186,6 +188,7 @@ APR_DECLARE(apr_status_t) apr_os_pipe_pu
     (*file)->pipe = 1;
     (*file)->blocking = BLK_UNKNOWN; /* app needs to make a timeout call */
     (*file)->timeout = -1;
+    (*file)->ungetchar = -1;
     (*file)->filedes = *thefile;
 
     if (register_cleanup) {

Modified: apr/apr/trunk/file_io/os2/readwrite.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/file_io/os2/readwrite.c?rev=930686&r1=930685&r2=930686&view=diff
==============================================================================
--- apr/apr/trunk/file_io/os2/readwrite.c (original)
+++ apr/apr/trunk/file_io/os2/readwrite.c Sun Apr  4 13:10:34 2010
@@ -53,6 +53,13 @@ APR_DECLARE(apr_status_t) apr_file_read(
         return APR_EBADF;
     }
 
+    if (thefile->ungetchar != -1 && req_nbytes >= 1) {
+        *(char *)buf = (char)thefile->ungetchar;
+        (char *)buf++;
+        (*nbytes)--;
+        thefile->ungetchar = -1;
+    }
+
     if (thefile->buffered) {
         char *pos = (char *)buf;
         ULONG blocksize;
@@ -249,8 +256,8 @@ APR_DECLARE(apr_status_t) apr_file_putc(
 
 APR_DECLARE(apr_status_t) apr_file_ungetc(char ch, apr_file_t *thefile)
 {
-    apr_off_t offset = -1;
-    return apr_file_seek(thefile, APR_CUR, &offset);
+    thefile->ungetchar = (unsigned char)ch;
+    return APR_SUCCESS;
 }
 
 

Modified: apr/apr/trunk/include/arch/os2/apr_arch_file_io.h
URL: http://svn.apache.org/viewvc/apr/apr/trunk/include/arch/os2/apr_arch_file_io.h?rev=930686&r1=930685&r2=930686&view=diff
==============================================================================
--- apr/apr/trunk/include/arch/os2/apr_arch_file_io.h (original)
+++ apr/apr/trunk/include/arch/os2/apr_arch_file_io.h Sun Apr  4 13:10:34 2010
@@ -55,6 +55,8 @@ struct apr_file_t {
     int direction;            // buffer being used for 0 = read, 1 = write
     unsigned long filePtr;    // position in file of handle
     apr_thread_mutex_t *mutex;// mutex semaphore, must be owned to access the above fields
+
+    int ungetchar;
 };
 
 struct apr_dir_t {