static OCerror ocextractdds(OCstate* state, OCtree* tree) { OCerror stat = OC_NOERR; size_t ddslen, bod, bodfound; #ifdef OC_DISK_STORAGE /* Read until we find the separator (or EOF)*/ ocbytesclear(state->packet); rewind(tree->data.file); do { char chunk[128]; size_t count; /* read chunks of the file until we find the separator*/ count = fread(chunk,1,sizeof(chunk),tree->data.file); if(count <= 0) break; /* EOF;*/ ocbytesappendn(state->packet,chunk,count); bodfound = findbod(state->packet,&bod,&ddslen); } while(!bodfound); #else /*!OC_DISK_STORAGE*/ /* Read until we find the separator (or EOF)*/ bodfound = findbod(state->packet,&bod,&ddslen); #endif if(!bodfound) {/* No BOD; pretend */ bod = tree->data.bod; ddslen = tree->data.datasize; } tree->data.bod = bod; tree->data.ddslen = ddslen; /* copy out the dds */ if(ddslen > 0) { tree->text = (char*)ocmalloc(ddslen+1); memcpy((void*)tree->text,(void*)ocbytescontents(state->packet),ddslen); tree->text[ddslen] = '\0'; } else tree->text = NULL; #ifdef OC_DISK_STORAGE /* reset the position of the tmp file*/ fseek(tree->data.file,tree->data.bod,SEEK_SET); #else /* If the data part is not on an 8 byte boundary, make it so */ if(tree->data.bod % 8 != 0) { unsigned long count = tree->data.datasize - tree->data.bod; char* dst = ocbytescontents(state->packet); char* src = dst + tree->data.bod; int i; /* memcpy((void*)dst,(void*)src,count); overlap*/ for(i=0;i<count;i++) dst[i] = src[i]; /* avoid memcpy overlap */ tree->data.datasize = count; tree->data.bod = 0; tree->data.ddslen = 0; } #endif if(tree->text == NULL) stat = OC_EDATADDS; return THROW(stat); }
static OCerror ocextractddsinmemory(OCstate* state, OCtree* tree, OCflags flags) { OCerror stat = OC_NOERR; size_t ddslen, bod, bodfound; /* Read until we find the separator (or EOF)*/ bodfound = findbod(state->packet,&bod,&ddslen); if(!bodfound) {/* No BOD; pretend */ bod = tree->data.bod; ddslen = tree->data.datasize; } tree->data.bod = bod; tree->data.ddslen = ddslen; /* copy out the dds */ if(ddslen > 0) { tree->text = (char*)ocmalloc(ddslen+1); memcpy((void*)tree->text,(void*)ocbytescontents(state->packet),ddslen); tree->text[ddslen] = '\0'; } else tree->text = NULL; /* Extract the inmemory contents */ tree->data.memory = ocbytesextract(state->packet); #ifdef IGNORE /* guarantee the data part is on an 8 byte boundary */ if(tree->data.bod % 8 != 0) { unsigned long count = tree->data.datasize - tree->data.bod; memcpy(tree->xdrmemory,tree->xdrmemory+tree->data.bod,count); tree->data.datasize = count; tree->data.bod = 0; tree->data.ddslen = 0; } #endif if(tree->text == NULL) stat = OC_EDATADDS; return OCTHROW(stat); }
static OCerror ocextractddsinfile(OCstate* state, OCtree* tree, OCflags flags) { OCerror stat = OC_NOERR; size_t ddslen, bod, bodfound; /* Read until we find the separator (or EOF)*/ ocbytesclear(state->packet); rewind(tree->data.file); do { char chunk[1024]; size_t count; /* read chunks of the file until we find the separator*/ count = fread(chunk,1,sizeof(chunk),tree->data.file); if(count <= 0) break; /* EOF;*/ ocbytesappendn(state->packet,chunk,count); bodfound = findbod(state->packet,&bod,&ddslen); } while(!bodfound); if(!bodfound) {/* No BOD; pretend */ bod = tree->data.bod; ddslen = tree->data.datasize; } tree->data.bod = bod; tree->data.ddslen = ddslen; /* copy out the dds */ if(ddslen > 0) { tree->text = (char*)ocmalloc(ddslen+1); memcpy((void*)tree->text,(void*)ocbytescontents(state->packet),ddslen); tree->text[ddslen] = '\0'; } else tree->text = NULL; /* reset the position of the tmp file*/ fseek(tree->data.file,tree->data.bod,SEEK_SET); if(tree->text == NULL) stat = OC_EDATADDS; return OCTHROW(stat); }