Object range(DCEparsestate* state, Object sfirst, Object sstride, Object slast) { DCEslice* slice = (DCEslice*)dcecreate(CES_SLICE); unsigned long first=0,stride=0,last=0; /* Note: that incoming arguments are strings; we must convert to size_t; but we do know they are legal integers or NULL */ sscanf((char*)sfirst,"%lu",&first); /* always defined */ if(slast != NULL) sscanf((char*)slast,"%lu",&last); else last = first; if(sstride != NULL) sscanf((char*)sstride,"%lu",&stride); else stride = 1; /* default */ if(stride == 0) dceerror(state,"Illegal index for range stride"); if(last < first) dceerror(state,"Illegal index for range last index"); slice->first = first; slice->stride = (stride == 0 ? 1 : stride); slice->last = last; slice->length = (slice->last - slice->first) + 1; slice->count = slice->length / slice->stride; #ifdef DEBUG fprintf(stderr," ce.slice: %s\n", dumpslice(slice)); #endif return slice; }
char* dumpslices(DCEslice* slice, unsigned int rank) { int i; NCbytes* buf; char* result = NULL; buf = ncbytesnew(); for(i=0;i<rank;i++,slice++) { ncbytescat(buf,dumpslice(slice)); } result = ncbytesdup(buf); ncbytesfree(buf); return result; }