Răsfoiți Sursa

Added __PHYSFS_addToLinkedStringList().

Ryan C. Gordon 23 ani în urmă
părinte
comite
01567b3dcf
2 a modificat fișierele cu 50 adăugiri și 1 ștergeri
  1. 37 1
      physfs.c
  2. 13 0
      physfs_internal.h

+ 37 - 1
physfs.c

@@ -1210,7 +1210,7 @@ int PHYSFS_isDirectory(const char *fname)
         DirHandle *h = i->dirHandle;
         if (__PHYSFS_verifySecurity(h, fname))
         {
-            if (!h->funcs->exists(h, fname))
+            if (!h->funcs->exists(h, fname))  /* !!! FIXME: Let archivers figure this out. */
                 __PHYSFS_setError(ERR_NO_SUCH_FILE);
             else
             {
@@ -1461,5 +1461,41 @@ PHYSFS_sint64 PHYSFS_fileLength(PHYSFS_file *handle)
     return(h->funcs->fileLength(h));
 } /* PHYSFS_filelength */
 
+
+LinkedStringList *__PHYSFS_addToLinkedStringList(LinkedStringList *retval,
+                                                 LinkedStringList **prev,
+                                                 const char *str,
+                                                 PHYSFS_sint32 len)
+{
+    LinkedStringList *l;
+
+    l = (LinkedStringList *) malloc(sizeof (LinkedStringList));
+    BAIL_IF_MACRO(l == NULL, ERR_OUT_OF_MEMORY, retval);
+
+    if (len < 0)
+        len = strlen(str);
+
+    l->str = (char *) malloc(len + 1);
+    if (l->str == NULL)
+    {
+        free(l);
+        BAIL_MACRO(ERR_OUT_OF_MEMORY, retval);
+    } /* if */
+
+    strncpy(l->str, str, len);
+    l->str[len] = '\0';
+
+    if (retval == NULL)
+        retval = l;
+    else
+        (*prev)->next = l;
+
+    *prev = l;
+    l->next = NULL;
+    return(retval);
+} /* __PHYSFS_addToLinkedStringList */
+
+
+
 /* end of physfs.c ... */
 

+ 13 - 0
physfs_internal.h

@@ -166,6 +166,8 @@ typedef struct __PHYSFS_DIRFUNCTIONS__
         /*
          * Returns non-zero if filename is really a directory.
          *  This filename is in platform-independent notation.
+         *  Symlinks should be followed; if what the symlink points
+         *  to is missing, or isn't a directory, then the retval is zero.
          */
     int (*isDirectory)(DirHandle *r, const char *name);
 
@@ -317,6 +319,17 @@ char *__PHYSFS_convertToDependent(const char *prepend,
 int __PHYSFS_verifySecurity(DirHandle *h, const char *fname);
 
 
+/*
+ * Use this to build the list that your enumerate function should return.
+ *  See zip.c for an example of proper use.
+ */
+LinkedStringList *__PHYSFS_addToLinkedStringList(LinkedStringList *retval,
+                                                 LinkedStringList **prev,
+                                                 const char *str,
+                                                 PHYSFS_sint32 len);
+
+
+
 /* These get used all over for lessening code clutter. */
 #define BAIL_MACRO(e, r) { __PHYSFS_setError(e); return r; }
 #define BAIL_IF_MACRO(c, e, r) if (c) { __PHYSFS_setError(e); return r; }