]> git.llucax.com Git - z.facultad/75.06/jacu.git/blobdiff - src/vfile/vfile.c
Se quita repeticion de pagesize en cada bloque comprimido, grabandose una sola vez...
[z.facultad/75.06/jacu.git] / src / vfile / vfile.c
index 444deb21fa9c1d89f2ae7ed5d9a73fce96b4b0f7..589d4aa1212bf1af2ca3fedd95c9f527561164df 100644 (file)
@@ -98,6 +98,11 @@ int vfclose(VFILE* vfp)
        return ret;
 }
 
        return ret;
 }
 
+int vfeof(VFILE* vfp)
+{
+       return vfp->lastvol && feof(vfp->fp);
+}
+
 int vfgetc(VFILE* vfp)
 {
        int c;
 int vfgetc(VFILE* vfp)
 {
        int c;
@@ -127,20 +132,29 @@ int vfputc(int c, VFILE* vfp)
 
 size_t vfread(void* ptr, size_t size, size_t nmemb, VFILE* vfp)
 {
 
 size_t vfread(void* ptr, size_t size, size_t nmemb, VFILE* vfp)
 {
-       int i = 0;
+       int c;
+       size_t i = 0;
        size_t total = size * nmemb;
        /* leo uno a uno y si hay error salgo. */
        size_t total = size * nmemb;
        /* leo uno a uno y si hay error salgo. */
-       while (i < total && (((char*)ptr)[i++] = vfgetc(vfp)) != EOF);
-       return i % size;
+       while (i < total)
+       {
+               if ((c = vfgetc(vfp)) == EOF)
+               {
+                       PERR("vfread: EOF");
+                       break;
+               }
+               else ((char*)ptr)[i++] = c;
+       }
+       return i / size;
 }
 
 size_t vfwrite(const void *ptr, size_t size, size_t nmemb, VFILE* vfp)
 {
 }
 
 size_t vfwrite(const void *ptr, size_t size, size_t nmemb, VFILE* vfp)
 {
-       int i = 0;
+       size_t i = 0;
        size_t total = size * nmemb;
        /* escribo uno a uno y si hay error salgo. */
        while (i < total && (vfputc(((char*)ptr)[i++], vfp)) != EOF);
        size_t total = size * nmemb;
        /* escribo uno a uno y si hay error salgo. */
        while (i < total && (vfputc(((char*)ptr)[i++], vfp)) != EOF);
-       return i % size;
+       return i / size;
 }
 
 int vfvol_close(VFILE* vfp)
 }
 
 int vfvol_close(VFILE* vfp)