[physfs] Getting every instance of overlapping files

Tim Čas darkuranium at gmail.com
Wed Aug 27 05:39:20 EDT 2014


Did you replace the DLLs after compiling? The application might still be
using the old one if you forgot to do that.


On 27 August 2014 10:10, Haydn Harach <hharach at gmail.com> wrote:

> PHYSFS_openReadMulti compiles just fine, but then my app crashes because
> it can't find it in physfs.dll.  So, it found it in the .a, but not in the
> .dll?  what am I doing wrong compiling physfs? >.<
>
>
> On Tue, Aug 26, 2014 at 9:51 AM, Haydn Harach <hharach at gmail.com> wrote:
>
>> Now I'm having trouble rebuilding the project.  I'm trying to use a
>> code::blocks project which I generated with cmake, changing only the 2
>> files (physfs.c and physfs.h).  It compiles and builds just fine, but I'm
>> getting "undefined reference to PHYSFS_closeList" now.  What did I do wrong?
>>
>>
>> On Mon, Aug 25, 2014 at 6:55 PM, Haydn Harach <hharach at gmail.com> wrote:
>>
>>> Alrighty, here are the additions I've made to my physfs.c:
>>>
>>> PHYSFS_File **PHYSFS_openReadMulti(const char *_fname)
>>> {
>>>     char *fname;
>>>     size_t len;
>>>
>>>     BAIL_IF_MACRO(_fname == NULL, ERR_INVALID_ARGUMENT, 0);
>>>     len = strlen(_fname) + 1;
>>>     fname = (char *) __PHYSFS_smallAlloc(len);
>>>     BAIL_IF_MACRO(fname == NULL, ERR_OUT_OF_MEMORY, 0);
>>>
>>>     FileHandle** ret = NULL;
>>>     unsigned int retcount = 0;
>>>
>>>     if (sanitizePlatformIndependentPath(_fname, fname))
>>>     {
>>>         int fileExists = 0;
>>>         DirHandle *i = NULL;
>>>         fvoid *opaque = NULL;
>>>
>>>         __PHYSFS_platformGrabMutex(stateLock);
>>>
>>>         GOTO_IF_MACRO(!searchPath, ERR_NO_SUCH_PATH, openReadEnd);
>>>
>>>         /* !!! FIXME: Why aren't we using a for loop here? */
>>>         i = searchPath;
>>>
>>>         do
>>>         {
>>>             char *arcfname = fname;
>>>             if (verifyPath(i, &arcfname, 0))
>>>             {
>>>                 opaque = i->funcs->openRead(i->opaque, arcfname,
>>> &fileExists);
>>>                 if (opaque)
>>>                 {
>>>                    // We found a valid file, let's prepare it.
>>>                    FileHandle* h =
>>> (FileHandle*)allocator.Malloc(sizeof(FileHandle));
>>>                    if (h == NULL)
>>>                    {
>>>                       i->funcs->fileClose(opaque);
>>>                         GOTO_MACRO(ERR_OUT_OF_MEMORY, openReadEnd);
>>>                    }
>>>                    memset(h, 0, sizeof(FileHandle));
>>>                    h->opaque = opaque;
>>>                    h->forReading = 1;
>>>                    h->dirHandle = i;
>>>                    h->funcs = i->funcs;
>>>                    h->next = openReadList;
>>>                    openReadList = h;
>>>
>>>                      // Add the file to the list
>>>                      FileHandle** temp =
>>> (FileHandle**)allocator.Malloc(sizeof(FileHandle) * (retcount + 1));
>>>                      if (temp == NULL)
>>>                      {
>>>                         allocator.Free(h);
>>>                         i->funcs->fileClose(opaque);
>>>                         GOTO_MACRO(ERR_OUT_OF_MEMORY, openReadEnd);
>>>                      }
>>>                      if (ret != NULL)
>>>                      {
>>>                         memcpy(temp, ret, sizeof(FileHandle) * retcount);
>>>                         allocator.Free(ret);
>>>                      }
>>>                      temp[retcount] = h;
>>>                      ++retcount;
>>>                      ret = temp;
>>>                 }
>>>             } /* if */
>>>             i = i->next;
>>>         } while ((i != NULL) && (!fileExists));
>>>
>>>         // Add a null terminator to the list
>>>         if (ret != NULL)
>>>         {
>>>            FileHandle** temp =
>>> (FileHandle**)allocator.Malloc(sizeof(FileHandle) * (retcount + 1));
>>>            if (temp == NULL)
>>>                GOTO_MACRO(ERR_OUT_OF_MEMORY, openReadEnd);
>>>
>>>             memcpy(temp, ret, sizeof(FileHandle) * retcount);
>>>             allocator.Free(ret);
>>>
>>>             temp[retcount] = NULL;
>>>             ret = temp;
>>>         }
>>>
>>>         openReadEnd:
>>>         __PHYSFS_platformReleaseMutex(stateLock);
>>>     } /* if */
>>>
>>>     __PHYSFS_smallFree(fname);
>>>     return ret;
>>> } /* PHYSFS_openReadMulti */
>>>
>>> int PHYSFS_closeList(PHYSFS_file** list)
>>> {
>>>    int retval = 1;
>>>
>>>    for (PHYSFS_file** i = list; *i != NULL; ++i)
>>>    {
>>>       if (PHYSFS_close(*i) == 0)
>>>          retval = 0;
>>>    }
>>>
>>>    allocator.Free(list);
>>>    return retval;
>>> }
>>>
>>>  Is there anything not immediately obvious that I'm missing?
>>>
>>>
>>> On Mon, Aug 25, 2014 at 6:11 PM, Edward Rudd <urkle at outoforder.cc>
>>> wrote:
>>>
>>>> On Aug 25, 2014, at 8:06 PM, Haydn Harach <hharach at gmail.com> wrote:
>>>>
>>>> > Looking at PHYSFS_openRead() in physfs.c, I've found this little
>>>> snippet:
>>>> >
>>>> > do
>>>> >         {
>>>> >             char *arcfname = fname;
>>>> >             if (verifyPath(i, &arcfname, 0))
>>>> >             {
>>>> >                 opaque = i->funcs->openRead(i->opaque, arcfname,
>>>> &fileExists);
>>>> >                 if (opaque)
>>>> >                     break;
>>>> >             } /* if */
>>>> >             i = i->next;
>>>> >         } while ((i != NULL) && (!fileExists));
>>>> >
>>>> > Now, from what I can see, this loop goes through all the paths, and
>>>> the first one that satisfies the function and returns some data (from the
>>>> openRead function) and causes 'opaque' to not be NULL, and thus breaks out
>>>> of the loop.
>>>> >
>>>> > So, if I replaced "if (opaque) break;" with "if (opaque)
>>>> someVector.emplace_back(opaque, i);", then did some cleanup to ensure that
>>>> I have a vector of FileHandle's instead of one, and return that, this
>>>> should be exactly what I'm looking for, yes?
>>>>
>>>> More or less, yes that would be exactly what you were looking for.
>>>> _______________________________________________
>>>> physfs mailing list
>>>> physfs at icculus.org
>>>> http://icculus.org/mailman/listinfo/physfs
>>>>
>>>
>>>
>>
>
> _______________________________________________
> physfs mailing list
> physfs at icculus.org
> http://icculus.org/mailman/listinfo/physfs
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://icculus.org/pipermail/physfs/attachments/20140827/848a4ffe/attachment-0001.html>


More information about the physfs mailing list