static rc_t parse_header(SRF_context *ctx, ZTR_Context *ztr_ctx, const uint8_t *data, size_t size) { rc_t rc = 0; size_t parsed; char prefixType; uint32_t counter; ztr_raw_t ztr_raw; ztr_t ztr; enum ztr_chunk_type type; fe_context_t* fe = (fe_context_t*)ctx; rc = SRF_ParseDataChunk(data, size, &parsed, &fe->name_prefix, &prefixType, &counter); if(rc) { rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcInvalid); return SRALoaderFile_LOG(ctx->file, klogErr, rc, "corrupt", NULL); } if(fe->defered != NULL) { free((void *)fe->defered); fe->defered = NULL; } if(parsed == size) return 0; rc = ZTR_AddToBuffer(ztr_ctx, data + parsed, size - parsed); if(rc) return rc; if((rc = ZTR_ParseHeader(ztr_ctx)) != 0) { return SRALoaderFile_LOG(ctx->file, klogErr, rc, "corrupt", NULL); } while (rc == 0 && !ZTR_BufferIsEmpty(ztr_ctx)) { if((rc = ZTR_ParseBlock(ztr_ctx, &ztr_raw)) != 0) { if(GetRCState(rc) == rcInsufficient && GetRCObject(rc) == (enum RCObject)rcData) rc = ZTR_BufferGetRemainder(ztr_ctx, &fe->defered, &fe->defered_len); break; } if((rc = ZTR_ProcessBlock(ztr_ctx, &ztr_raw, &ztr, &type)) != 0) { SRALoaderFile_LOG(ctx->file, klogErr, rc, "corrupt", NULL); break; } if(*(void **)&ztr != NULL) free(*(void **)&ztr); if(ztr_raw.meta != NULL) free(ztr_raw.meta); if(ztr_raw.data != NULL) free(ztr_raw.data); } return rc; }
static rc_t parse_v1_header(SRF_context *ctx, ZTR_Context *ztr_ctx, const uint8_t *data, size_t size) { rc_t rc = 0; size_t parsed; char prefixType; uint32_t counter; ztr_raw_t ztr_raw; ztr_t ztr; enum ztr_chunk_type type; fe_context_t* fe = (fe_context_t*)ctx; if( (rc = SRF_ParseDataChunk(data, size, &parsed, &fe->name_prefix, &prefixType, &counter)) != 0 ) { rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcInvalid); return SRALoaderFile_LOG(ctx->file, klogErr, rc, "parse_v1_header - failed to parse SRF chunk", NULL); } DEBUG_MSG(3, ("HEADER PREFIX: '%s'\n", fe->name_prefix.data)); if((rc = ABI_ZTR_AddToBuffer(ztr_ctx, data + parsed, size - parsed)) != 0) { return rc; } if((rc = ABI_ZTR_ParseHeader(ztr_ctx)) != 0) { return SRALoaderFile_LOG(ctx->file, klogErr, rc, "parse_v1_header - failed to parse ZTR header", NULL); } while(rc == 0 && !ABI_ZTR_BufferIsEmpty(ztr_ctx)) { if((rc = ABI_ZTR_ParseBlock(ztr_ctx, &ztr_raw)) != 0) { return SRALoaderFile_LOG(ctx->file, klogErr, rc, "parse_v1_header - failed to parse ZTR chunk", NULL); } if((rc = ABI_ZTR_ProcessBlock(ztr_ctx, &ztr_raw, &ztr, &type)) != 0) { SRALoaderFile_LOG(ctx->file, klogErr, rc, "parse_v1_header - failed to process ZTR chunk", NULL); } if(type == REGN) { rc = fe_new_region(fe, ztr.region->count, ztr.region->region); } if(*(void **)&ztr != NULL) { free(*(void **)&ztr); } } return rc; }