]> git.llucax.com Git - z.facultad/75.06/jacu.git/blobdiff - src/vfile/vfile.c
Agrego Descomprimir con diccionario. POR AHORA SE NECESITA PASAR -r AL DESCOMPRIMIR...
[z.facultad/75.06/jacu.git] / src / vfile / vfile.c
index 589d4aa1212bf1af2ca3fedd95c9f527561164df..7136eed5e40efc2aee191050f420e03ed258aa41 100644 (file)
@@ -159,25 +159,31 @@ size_t vfwrite(const void *ptr, size_t size, size_t nmemb, VFILE* vfp)
 
 int vfvol_close(VFILE* vfp)
 {
 
 int vfvol_close(VFILE* vfp)
 {
-       /* Si es de escritura y el último guardo la cabecera. */
-       if (vfp->mode == VFWRITE && vfp->lastvol)
+       int ret = 0;
+       if (vfp->fp)
        {
        {
-               int ret;
-               PERR("vfvol_close: modo == VFWRITE");
-               /* Me posiciono al principio del archivo. */
-               if ((ret = fseek(vfp->fp, 0l, SEEK_SET)))
+               /* Si es de escritura y el último guardo la cabecera. */
+               if (vfp->mode == VFWRITE && vfp->lastvol)
                {
                {
-                       PERR("vfvol_close: fseek error");
-                       return ret; /* fseek error. */
-               }
-               /* Guardo cabecera para indicar si es el último volumen o no. */
-               if ((ret = fputc(vfp->lastvol, vfp->fp)) == EOF)
-               {
-                       PERR("vfvol_close: fputc error");
-                       return ret; /* fputc error. */
+                       int ret;
+                       PERR("vfvol_close: modo == VFWRITE");
+                       /* Me posiciono al principio del archivo. */
+                       if ((ret = fseek(vfp->fp, 0l, SEEK_SET)))
+                       {
+                               PERR("vfvol_close: fseek error");
+                               return ret; /* fseek error. */
+                       }
+                       /* Guardo cabecera para indicar si es el último volumen o no. */
+                       if ((ret = fputc(vfp->lastvol, vfp->fp)) == EOF)
+                       {
+                               PERR("vfvol_close: fputc error");
+                               return ret; /* fputc error. */
+                       }
                }
                }
+               ret = fclose(vfp->fp);
+               vfp->fp = 0;
        }
        }
-       return fclose(vfp->fp);
+       return ret;
 }
 
 int vfvol_open_next(VFILE* vfp)
 }
 
 int vfvol_open_next(VFILE* vfp)
@@ -215,3 +221,54 @@ int vfvol_open_next(VFILE* vfp)
        return 0;
 }
 
        return 0;
 }
 
+long vfsize(const char* path)
+{
+       VFILE* vfp = vfopen(path, "r", 0);
+       long size;
+       if (!vfp) return -1; /* error */
+       if (fseek(vfp->fp, 0l, SEEK_END) == -1)
+       {
+               vfclose(vfp);
+               return -1; /* error */
+       }
+       else
+       {
+               size = ftell(vfp->fp);
+               if (size == -1)
+               {
+                       vfclose(vfp);
+                       return -1; /* error */
+               }
+       }
+       while (!vfp->lastvol) /* mientras no sea el último volumen */
+       {
+               if (vfvol_open_next(vfp))
+               {
+                       vfclose(vfp);
+                       return -1; /* error */
+               }
+               if (fseek(vfp->fp, 0l, SEEK_END) == -1)
+               {
+                       vfclose(vfp);
+                       return -1; /* error */
+               }
+               else
+               {
+                       long curr_size = ftell(vfp->fp);
+                       if (curr_size == -1)
+                       {
+                               vfclose(vfp);
+                               return -1; /* error */
+                       }
+                       size += curr_size;
+               }
+               if (vfvol_close(vfp))
+               {
+                       vfclose(vfp);
+                       return -1; /* error */
+               }
+       }
+       vfclose(vfp);
+       return size;
+}
+