static void compute_size(grib_accessor* a) { long slen = 0; long off = 0; grib_accessor_bitmap* self = (grib_accessor_bitmap*)a; grib_get_long_internal(a->parent->h, self->offsetbsec,&off); grib_get_long_internal(a->parent->h, self->sLength, &slen); if(slen == 0) { grib_accessor* seclen; size_t size; /* Assume reparsing */ Assert(a->parent->h->loader != 0); if (a->parent->h->loader != 0) { seclen = grib_find_accessor(a->parent->h, self->sLength); Assert(seclen); grib_get_block_length(seclen->parent,&size); slen = size; } } #if 0 printf("compute_size off=%ld slen=%ld a->offset=%ld\n", (long)off,(long)slen,(long)a->offset); #endif a->length = off+(slen-a->offset); if(a->length < 0) { /* Assume reparsing */ /*Assert(a->parent->h->loader != 0);*/ a->length = 0; } Assert(a->length>=0); }
static int notify_change(grib_action* act, grib_accessor * notified, grib_accessor* changed) { grib_loader loader = { 0,}; grib_section *old_section = NULL; grib_handle *h = notified->parent->h; size_t len = 0; size_t size = 0; int err=0; grib_handle* tmp_handle; int doit = 0; grib_action* la = NULL; grib_context_log(h->context, GRIB_LOG_DEBUG,"------------- SECTION action %s (%s) is triggerred by [%s]", act->name, notified->name, changed->name); la = grib_action_reparse(act,notified,&doit); old_section = notified->sub_section; Assert(old_section); Assert(old_section->h == h); /* printf("old = %p\n",(void*)old_section->branch); */ /* printf("new = %p\n",(void*)la); */ grib_context_log(h->context, GRIB_LOG_DEBUG,"------------- DOIT %ld OLD %p NEW %p", doit,old_section->branch,la); if(!doit) { if(la != NULL || old_section->branch != NULL) if(la == old_section->branch) { grib_context_log(h->context,GRIB_LOG_DEBUG,"IGNORING TRIGGER action %s (%s) is triggerred %p", act->name, notified->name ,(void*)la); return GRIB_SUCCESS; } } loader.list_is_resized = (la == old_section->branch); if (!strcmp(changed->name,"GRIBEditionNumber")) loader.changing_edition=1; else loader.changing_edition=0; old_section->branch = la; tmp_handle = grib_new_handle(h->context); if(!tmp_handle) return GRIB_OUT_OF_MEMORY; tmp_handle->buffer = grib_create_growable_buffer(h->context); Assert(tmp_handle->buffer); /* FIXME */ loader.data = h; loader.lookup_long = grib_lookup_long_from_handle; loader.init_accessor = grib_init_accessor_from_handle; Assert(h->kid == NULL); tmp_handle->loader = &loader; tmp_handle->main = h; h->kid = tmp_handle; /* printf("tmp_handle- main %p %p\n",(void*)tmp_handle,(void*)h); */ grib_context_log(h->context,GRIB_LOG_DEBUG,"------------- CREATE TMP BLOCK ", act->name, notified->name); tmp_handle->root = grib_section_create(tmp_handle,NULL); tmp_handle->use_trie=1; err=grib_create_accessor(tmp_handle->root, act, &loader); grib_section_adjust_sizes(tmp_handle->root,1,0); grib_section_post_init(tmp_handle->root); /* grib_recompute_sections_lengths(tmp_handle->root); */ grib_get_block_length(tmp_handle->root,&len); grib_context_log(h->context,GRIB_LOG_DEBUG,"------------- TMP BLOCK IS sectlen=%d buffer=%d", len, tmp_handle->buffer->ulength); #if 0 if(h->context->debug > 10) grib_dump_content(tmp_handle,stdout,NULL,0,NULL); #endif /* Assert(tmp_handle->buffer->ulength == len); */ /* grib_empty_section(h->context,old_section); */ grib_buffer_replace(notified, tmp_handle->buffer->data, tmp_handle->buffer->ulength,0,1); grib_swap_sections(old_section, tmp_handle->root->block->first->sub_section); Assert(tmp_handle->dependencies == NULL); /* printf("grib_handle_delete %p\n",(void*)tmp_handle); */ grib_handle_delete(tmp_handle); h->use_trie = 1; h->trie_invalid=1; h->kid = NULL; grib_section_adjust_sizes(h->root,1,0); grib_section_post_init(h->root); grib_get_block_length(old_section,&size); grib_context_log(h->context,GRIB_LOG_DEBUG,"------------- BLOCK SIZE %ld, buffer len=%ld", size,len); if(h->context->debug > 10) grib_dump_content(h,stdout,"debug",~0,NULL); Assert(size == len); grib_update_paddings(old_section); return err; }