[physfs] Getting every instance of overlapping files

Haydn Harach hharach at gmail.com
Wed Aug 27 04:10:05 EDT 2014


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
>>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://icculus.org/pipermail/physfs/attachments/20140827/e9f98cd8/attachment.html>


More information about the physfs mailing list