Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/eet

Dir     : e17/libs/eet/src/lib


Modified Files:
        Eet.h eet_lib.c 


Log Message:


add a delete call

===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/eet/src/lib/Eet.h,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -3 -r1.17 -r1.18
--- Eet.h       25 Nov 2004 05:15:48 -0000      1.17
+++ Eet.h       2 Dec 2004 04:25:25 -0000       1.18
@@ -188,6 +188,23 @@
     * closed though).
     */
    EAPI int       eet_write (Eet_File *ef, char *name, void *data, int size, 
int compress);
+
+   /**
+    * Delete a specified entry from an Eet file being written or re-written
+    * @param ef A valid eet file handle opened for writing.
+    * @param name Name of the entry. eg: "/base/file_i_want".
+    * @return Success or failure of the delete.
+    * 
+    * This function will delete the specified chunk of data from the eet file
+    * and return greater than 0 on success. 0 will be returned on failure.
+    * 
+    * The eet file handle must be a valid file handle for an eet file opened 
+    * for writing. If it is not, 0 will be returned and no action will be
+    * performed.
+    * 
+    * Name, must not be NULL, otherwise 0 will be returned.
+    */
+   EAPI int       eet_delete(Eet_File *ef, char *name);
    
    /**
     * List all entries in eet file matching shell glob.
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/eet/src/lib/eet_lib.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -3 -r1.18 -r1.19
--- eet_lib.c   31 Oct 2004 11:21:30 -0000      1.18
+++ eet_lib.c   2 Dec 2004 04:25:25 -0000       1.19
@@ -281,34 +281,37 @@
             unsigned char *buf;
             int buf_size;
             int name_size;
-            
-            name_size = strlen(ef->header->directory->hash[i].node[j].name);
-            buf_size = 20 + name_size;
-            buf = malloc(buf_size);
-            if (!buf) return;
-            i1 = (unsigned long 
int)ef->header->directory->hash[i].node[j].offset;
-            i2 = htonl(i1);
-            *((int *)(buf + 0)) = (int)i2;
-            i1 = (unsigned long 
int)ef->header->directory->hash[i].node[j].compression;
-            i2 = htonl(i1);
-            *((int *)(buf + 4)) = (int)i2;
-            i1 = (unsigned long 
int)ef->header->directory->hash[i].node[j].size;
-            i2 = htonl(i1);
-            *((int *)(buf + 8)) = (int)i2;
-            i1 = (unsigned long 
int)ef->header->directory->hash[i].node[j].data_size;
-            i2 = htonl(i1);
-            *((int *)(buf + 12)) = (int)i2;
-            i1 = (unsigned long int)name_size;
-            i2 = htonl(i1);
-            *((int *)(buf + 16)) = (int)i2;
-            memcpy(buf + 20, ef->header->directory->hash[i].node[j].name, 
name_size);
-            if (fwrite(buf, buf_size, 1, ef->fp) != 1) 
+
+            if (ef->header->directory->hash[i].node[j].compression >= 0)
               {
+                 name_size = 
strlen(ef->header->directory->hash[i].node[j].name);
+                 buf_size = 20 + name_size;
+                 buf = malloc(buf_size);
+                 if (!buf) return;
+                 i1 = (unsigned long 
int)ef->header->directory->hash[i].node[j].offset;
+                 i2 = htonl(i1);
+                 *((int *)(buf + 0)) = (int)i2;
+                 i1 = (unsigned long 
int)ef->header->directory->hash[i].node[j].compression;
+                 i2 = htonl(i1);
+                 *((int *)(buf + 4)) = (int)i2;
+                 i1 = (unsigned long 
int)ef->header->directory->hash[i].node[j].size;
+                 i2 = htonl(i1);
+                 *((int *)(buf + 8)) = (int)i2;
+                 i1 = (unsigned long 
int)ef->header->directory->hash[i].node[j].data_size;
+                 i2 = htonl(i1);
+                 *((int *)(buf + 12)) = (int)i2;
+                 i1 = (unsigned long int)name_size;
+                 i2 = htonl(i1);
+                 *((int *)(buf + 16)) = (int)i2;
+                 memcpy(buf + 20, ef->header->directory->hash[i].node[j].name, 
name_size);
+                 if (fwrite(buf, buf_size, 1, ef->fp) != 1) 
+                   {
+                      free(buf);
+                      return;
+                   }
+                 offset += buf_size;
                  free(buf);
-                 return;
               }
-            offset += buf_size;
-            free(buf);
          }
      }
    /* write data */
@@ -914,6 +917,7 @@
                  ef->header->directory->hash[hash].node[i].data_size = size;
                  ef->header->directory->hash[hash].node[i].data = data2;
                  exists_already = 1;
+                 break;
               }
          }
      }
@@ -946,6 +950,51 @@
    return data_size;
 }
 
+int
+eet_delete(Eet_File *ef, char *name)
+{
+   int hash, node_size;
+   Eet_File_Node *node;
+   int exists_already = 0;
+   
+   /* check to see its' an eet file pointer */   
+   if ((!ef) || (ef->magic != EET_MAGIC_FILE)
+       || (!name) ||
+       ((ef->mode != EET_FILE_MODE_WRITE) &&
+        (ef->mode != EET_FILE_MODE_RW)))
+     return 0;
+
+   if (!ef->header) return 0;
+   
+   /* figure hash bucket */
+   hash = eet_hash_gen(name, ef->header->directory->size);
+   node_size = ef->header->directory->hash[hash].size;
+   
+   /* Does this node already exist? */
+   if (ef->mode == EET_FILE_MODE_RW)
+     {
+       int i;
+       for (i = 0; i < node_size; i++)
+         {
+            /* if it matches */
+            if 
(eet_string_match(ef->header->directory->hash[hash].node[i].name, name))
+              {
+                 free(ef->header->directory->hash[hash].node[i].data);
+                 ef->header->directory->hash[hash].node[i].compression = -1;
+                 ef->header->directory->hash[hash].node[i].size = 0;
+                 ef->header->directory->hash[hash].node[i].data_size = 0;
+                 ef->header->directory->hash[hash].node[i].data = NULL;
+                 exists_already = 1;
+                 break;
+              }
+         }
+     }
+   /* flags that writes are pending */
+   if (exists_already) ef->writes_pending = 1;
+   /* update access time */
+   return exists_already;
+}
+
 char **
 eet_list(Eet_File *ef, char *glob, int *count_ret)
 {




-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now. 
http://productguide.itmanagersjournal.com/
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to