Refactor zlib_parse_file

This commit is contained in:
twinaphex 2015-05-27 00:42:48 +02:00
parent 512edb1474
commit 376a1d49ba

View File

@ -479,6 +479,15 @@ end:
return ret; return ret;
} }
enum zlib_transfer_type
{
ZLIB_TRANSFER_NONE = 0,
ZLIB_TRANSFER_INIT,
ZLIB_TRANSFER_ITERATE,
ZLIB_TRANSFER_DEINIT,
ZLIB_TRANSFER_DEINIT_ERROR,
};
typedef struct zlib_transfer typedef struct zlib_transfer
{ {
void *handle; void *handle;
@ -486,6 +495,7 @@ typedef struct zlib_transfer
const uint8_t *directory; const uint8_t *directory;
const uint8_t *data; const uint8_t *data;
ssize_t zip_size; ssize_t zip_size;
enum zlib_transfer_type type;
const struct zlib_file_backend *backend; const struct zlib_file_backend *backend;
} zlib_transfer_t; } zlib_transfer_t;
@ -610,25 +620,46 @@ bool zlib_parse_file(const char *file, const char *valid_exts,
zlib_file_cb file_cb, void *userdata) zlib_file_cb file_cb, void *userdata)
{ {
zlib_transfer_t state = {0}; zlib_transfer_t state = {0};
bool ret = true; bool returnerr = true;
if (zlib_parse_file_init(&state, file) != 0) state.type = ZLIB_TRANSFER_INIT;
GOTO_END_ERROR();
for (;;) for (;;)
{ {
int ret2 = zlib_parse_file_iterate_step(&state, switch (state.type)
valid_exts, userdata, file_cb); {
if (ret2 == 0) case ZLIB_TRANSFER_NONE:
break;
case ZLIB_TRANSFER_INIT:
if (zlib_parse_file_init(&state, file) == 0)
state.type = ZLIB_TRANSFER_ITERATE;
else
state.type = ZLIB_TRANSFER_DEINIT_ERROR;
break;
case ZLIB_TRANSFER_ITERATE:
{
int ret2 = zlib_parse_file_iterate_step(&state,
valid_exts, userdata, file_cb);
if (ret2 != 1)
state.type = ZLIB_TRANSFER_DEINIT;
if (ret2 == -1)
state.type = ZLIB_TRANSFER_DEINIT_ERROR;
}
break;
case ZLIB_TRANSFER_DEINIT_ERROR:
returnerr = false;
case ZLIB_TRANSFER_DEINIT:
if (state.handle)
state.backend->free(state.handle);
break;
}
if (state.type == ZLIB_TRANSFER_DEINIT ||
state.type == ZLIB_TRANSFER_DEINIT_ERROR)
break; break;
if (ret2 == -1)
GOTO_END_ERROR();
} }
end: return returnerr;
if (state.handle)
state.backend->free(state.handle);
return ret;
} }
struct zip_extract_userdata struct zip_extract_userdata