Hi Dom,

appended one patch for wv to use my new wv_memory_streams
in picf.c and some bugfixes for my recent additions to support.c.

Robert
Index: picf.c
===================================================================
RCS file: /cvsroot/wv/picf.c,v
retrieving revision 1.27
diff -u -r1.27 picf.c
--- picf.c      21 Jan 2002 15:00:42 -0000      1.27
+++ picf.c      18 Feb 2002 18:21:24 -0000
@@ -11,9 +11,11 @@
 int
 wvGetPICF (wvVersion ver, PICF * apicf, wvStream * fd)
 {
-    FILE *f;
     U8 temp;
     U32 i;
+    U8 *buf,*p;
+    size_t size;
+
     long pos = wvStream_tell (fd);
 
     apicf->lcb = read_32ubit (fd);
@@ -64,17 +66,7 @@
     wvTrace (
             ("ends at %x\n",
              wvStream_tell (fd) + apicf->lcb - apicf->cbHeader));
-    f = tmpfile ();
-    if (f == NULL)
-      {
-         wvError (("Couldnt create tmpfile: %s\n", strerror (errno)));
-         apicf->rgb = NULL;
-         return 0;
-      }
-    /*
-       sprintf(buffer,"/tmp/newtest-%d",s++);
-       f = fopen(buffer,"w+b");
-     */
+
     i = 0;
 
     if (apicf->mfp_mm < 90)
@@ -131,40 +123,47 @@
 
          header_len = 14 + 40 + 4 * colors_used;
 
-         fputc (0x42, f); /* B */
-         fputc (0x4D, f); /* M */
+         size = apicf->lcb - apicf->cbHeader;
+         p = buf = malloc(apicf->lcb - apicf->cbHeader);
+
+         *p++ = 0x42; /* B */
+         *p++ = 0x4D; /* M */
 
-         fputc (len & 0x000000FF, f);
-         fputc ((len & 0x0000FF00) >> 8, f);
-         fputc ((len & 0x00FF0000) >> 16, f);
-         fputc ((len & 0xFF000000) >> 24, f);
-
-         fputc (0x00, f);
-         fputc (0x00, f);
-         fputc (0x00, f);
-         fputc (0x00, f);
-
-         fputc (header_len & 0x000000FF, f);
-         fputc ((header_len & 0x0000FF00) >> 8, f);
-         fputc ((header_len & 0x00FF0000) >> 16, f);
-         fputc ((header_len & 0xFF000000) >> 24, f);
+         *p++ = len & 0x000000FF;
+         *p++ = (len & 0x0000FF00) >> 8;
+         *p++ = (len & 0x00FF0000) >> 16;
+         *p++ = (len & 0xFF000000) >> 24;
+
+         *p++ = 0x00;
+         *p++ = 0x00;
+         *p++ = 0x00;
+         *p++ = 0x00;
+
+         *p++ = header_len & 0x000000FF;
+         *p++ = (header_len & 0x0000FF00) >> 8;
+         *p++ = (header_len & 0x00FF0000) >> 16;
+         *p++ = (header_len & 0xFF000000) >> 24;
 
 
          for(j=0;j< sizeof(bmp_header);j++)
-           fputc(bmp_header[j],f);
+           *p++=bmp_header[j];
          
          for (; i < apicf->lcb - apicf->cbHeader-sizeof(bmp_header); i++)
-           fputc (read_8ubit (fd), f);
+           *p++= read_8ubit (fd);
 
       }
     else
       {
+       size = apicf->lcb - apicf->cbHeader;
+       p = buf = malloc(size);
        for (; i < apicf->lcb - apicf->cbHeader; i++)
-         fputc (read_8ubit (fd), f);
+         *p++ = read_8ubit (fd);
       }
 
-    rewind (f);
-    wvStream_FILE_create (&apicf->rgb, f);
+    /*    rewind (f);
+         wvStream_FILE_create (&apicf->rgb, f); */
+
+    wvStream_memory_create(&apicf->rgb, buf, size); 
     return 1;
 }
 
Index: support.c
===================================================================
RCS file: /cvsroot/wv/support.c,v
retrieving revision 1.24
diff -u -r1.24 support.c
--- support.c   15 Feb 2002 15:24:56 -0000      1.24
+++ support.c   18 Feb 2002 18:21:25 -0000
@@ -84,9 +84,15 @@
 }
 
 void
-wvStream_memory_create (wvStream ** in, MemoryStream * inner)
+wvStream_memory_create (wvStream ** in, char *buf, size_t size)
 {
     wvInternalStream str;
+    MemoryStream *inner = (MemoryStream *)wvMalloc(sizeof(MemoryStream));
+
+    inner->mem = buf;
+    inner->size = size;
+    inner->current = 0;
+
     str.memory_stream = inner;
     wvStream_create (in, MEMORY_STREAM, str);
 }
@@ -128,8 +134,9 @@
       }
     else
       {
-       return  *((U32 *) (in->stream.memory_stream->mem + 
+       ret =  *((U32 *) (in->stream.memory_stream->mem + 
                 in->stream.memory_stream->current));
+       in->stream.memory_stream->current +=4;
       }
 #endif
     return (ret);
@@ -158,8 +165,9 @@
       }
     else
       {
-       return  *((U16 *) (in->stream.memory_stream->mem + 
+       ret =  *((U16 *) (in->stream.memory_stream->mem + 
                 in->stream.memory_stream->current));
+       in->stream.memory_stream->current+=2;
       }
 
 
@@ -183,8 +191,11 @@
       }
     else
       {
-       return  *((U8 *)(in->stream.memory_stream->mem + 
+         U8 ret;
+         ret =  *((U8 *)(in->stream.memory_stream->mem + 
                 in->stream.memory_stream->current));
+         in->stream.memory_stream->current++;
+         return ret;
       }
 }
 
@@ -204,6 +215,7 @@
       {
        memcpy(ptr, in->stream.memory_stream->mem + 
                     in->stream.memory_stream->current,size * nmemb);
+       in->stream.memory_stream->current+=size* nmemb;
        return size * nmemb;
       }
 }
@@ -260,6 +272,7 @@
     else
       {
        in->stream.memory_stream->current += offset;
+       return  in->stream.memory_stream->current;
       }
 }
 
@@ -279,7 +292,7 @@
       {
        in->stream.memory_stream->current = 
        in->stream.memory_stream->size + offset;
-        return 0;
+        return in->stream.memory_stream->current;
       }
 }
 
@@ -338,6 +351,7 @@
     if (in->kind == MEMORY_STREAM)
       {
          free (in->stream.memory_stream->mem);
+         free (in->stream.memory_stream);
          wvFree (in);
          return 0;
       }
Index: wv.h
===================================================================
RCS file: /cvsroot/wv/wv.h,v
retrieving revision 1.99
diff -u -r1.99 wv.h
--- wv.h        15 Feb 2002 15:24:56 -0000      1.99
+++ wv.h        18 Feb 2002 18:21:27 -0000
@@ -4443,6 +4439,7 @@
 /* These functions take care of memory/file management for wvStreams */
     void wvStream_FILE_create (wvStream ** in, FILE * inner);
     void wvStream_libole2_create (wvStream ** in, MsOleStream * inner);
+    void wvStream_memory_create (wvStream ** in, char *buf, size_t size);
     void wvStream_create (wvStream ** in, wvStreamKind kind,
                          wvInternalStream inner);
     U32 wvStream_close (wvStream * stream);

Reply via email to