]> git.llucax.com Git - z.facultad/75.06/jacu.git/blobdiff - src/vfile/vfile.c
Se agrega vfsize() para obtener el tamaño de un archivo multivolumen.
[z.facultad/75.06/jacu.git] / src / vfile / vfile.c
index aafb8514715b07632dd4a979d66e314eab0e742f..469ef768240fab65c6bbc0cb02a7c4befe39d002 100644 (file)
@@ -22,7 +22,7 @@
  * Autores: Leandro Lucarella <llucare@fi.uba.ar>
  *----------------------------------------------------------------------------
  *
- * $Id: bufford.c 624 2004-05-30 20:18:04Z llucare $
+ * $Id$
  *
  */
 
@@ -98,6 +98,11 @@ int vfclose(VFILE* vfp)
        return ret;
 }
 
+int vfeof(VFILE* vfp)
+{
+       return vfp->lastvol && feof(vfp->fp);
+}
+
 int vfgetc(VFILE* vfp)
 {
        int c;
@@ -127,12 +132,29 @@ int vfputc(int c, VFILE* vfp)
 
 size_t vfread(void* ptr, size_t size, size_t nmemb, VFILE* vfp)
 {
-       return 0;
+       int c;
+       size_t i = 0;
+       size_t total = size * nmemb;
+       /* leo uno a uno y si hay error salgo. */
+       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)
 {
-       return 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);
+       return i / size;
 }
 
 int vfvol_close(VFILE* vfp)
@@ -193,3 +215,54 @@ int vfvol_open_next(VFILE* vfp)
        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;
+}
+