void grib_buffer_replace( grib_accessor *a, const unsigned char* data, size_t newsize,int update_lengths,int update_paddings) { size_t offset = a->offset; long oldsize = grib_get_next_position_offset(a)-offset; long increase = (long)newsize - (long)oldsize; grib_buffer *buffer = grib_handle_of_accessor(a)->buffer; size_t message_length = buffer->ulength; grib_context_log(a->context,GRIB_LOG_DEBUG, "grib_buffer_replace %s offset=%ld oldsize=%ld newsize=%ld message_length=%ld update_paddings=%d", a->name,(long)offset,oldsize,(long)newsize,(long)message_length,update_paddings); grib_buffer_set_ulength(a->context, buffer, buffer->ulength+increase); /* move the end */ if(increase) memmove( buffer->data + offset + newsize, buffer->data + offset + oldsize, message_length - offset - oldsize); /* copy new data */ DebugAssert( buffer->data + offset ); DebugAssert( data || (newsize==0) );/* if data==NULL then newsize must be 0 */ if (data) { /* Note: memcpy behaviour is undefined if either dest or src is NULL */ memcpy(buffer->data + offset, data, newsize); } if(increase) { update_offsets_after(a,increase); if(update_lengths) { grib_update_size(a,newsize); grib_section_adjust_sizes(grib_handle_of_accessor(a)->root,1,0); if(update_paddings) grib_update_paddings(grib_handle_of_accessor(a)->root); } } }
void grib_update_sections_lengths(grib_handle* h) { grib_section_adjust_sizes(h->root,2,0); grib_update_paddings(h->root); }
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; }