static DirHandle *DIR_openArchive(const char *name, int forWriting) { const char *dirsep = PHYSFS_getDirSeparator(); DirHandle *retval = NULL; size_t namelen = strlen(name); size_t seplen = strlen(dirsep); BAIL_IF_MACRO(!DIR_isArchive(name, forWriting), ERR_UNSUPPORTED_ARCHIVE, NULL); retval = (DirHandle *) malloc(sizeof (DirHandle)); BAIL_IF_MACRO(retval == NULL, ERR_OUT_OF_MEMORY, NULL); retval->opaque = malloc(namelen + seplen + 1); if (retval->opaque == NULL) { free(retval); BAIL_MACRO(ERR_OUT_OF_MEMORY, NULL); } /* if */ /* make sure there's a dir separator at the end of the string */ strcpy((char *) (retval->opaque), name); if (strcmp((name + namelen) - seplen, dirsep) != 0) strcat((char *) (retval->opaque), dirsep); retval->funcs = &__PHYSFS_DirFunctions_DIR; return(retval); } /* DIR_openArchive */
static void *DIR_openArchive(const char *name, int forWriting) { const char *dirsep = PHYSFS_getDirSeparator(); char *retval = NULL; size_t namelen = strlen(name); size_t seplen = strlen(dirsep); /* !!! FIXME: when is this not called right before openArchive? */ BAIL_IF_MACRO(!DIR_isArchive(name, forWriting), ERR_UNSUPPORTED_ARCHIVE, 0); retval = allocator.Malloc(namelen + seplen + 1); BAIL_IF_MACRO(retval == NULL, ERR_OUT_OF_MEMORY, NULL); /* make sure there's a dir separator at the end of the string */ strcpy(retval, name); if (strcmp((name + namelen) - seplen, dirsep) != 0) strcat(retval, dirsep); return(retval); } /* DIR_openArchive */