const char* ocdtmodestring(OCDT mode,int compact) { static char result[1+(NMODES*(MAXMODENAME+1))]; /* hack to avoid malloc */ int i; char* p = result; result[0] = '\0'; if(mode == 0) { if(compact) *p++ = '-'; else if(!occoncat(result,sizeof(result),1,"NONE")) return NULL; } else for(i=0;;i++) { char* ms = modestrings[i]; if(ms == NULL) break; if(!compact && i > 0) if(!occoncat(result,sizeof(result),1,",")) return NULL; if(fisset(mode,(1<<i))) { if(compact) *p++ = ms[0]; else if(!occoncat(result,sizeof(result),1,ms)) return NULL; } } /* pad compact list out to NMODES in length (+1 for null terminator) */ if(compact) { while((p-result) < NMODES) *p++ = ' '; *p = '\0'; } return result; }
/* Move to the ith sequence record. */ OCerror ocdata_ithrecord(OCstate* state, OCdata* data, size_t index, /* record number */ OCdata** recordp ) { int stat = OC_NOERR; OCdata* record; OCnode* pattern; OCASSERT(state != NULL); OCASSERT(data != NULL); pattern = data->pattern; /* Must be a Sequence */ if(pattern->octype != OC_Sequence || !fisset(data->datamode,OCDT_SEQUENCE)) return OCTHROW(OC_EBADTYPE); /* Validate index */ if(index >= data->ninstances) return OCTHROW(OC_EINDEX); record = data->instances[index]; if(recordp) *recordp = record; octrace("ithrecord", state, record); return OCTHROW(stat); }
OCerror ocdata_position(OCstate* state, OCdata* data, size_t* indices) { OCnode* pattern; OCASSERT(state != NULL); OCASSERT(data != NULL); OCASSERT(indices != NULL); pattern = data->pattern; if(fisset(data->datamode,OCDT_RECORD)) indices[0] = data->index; else if(fisset(data->datamode,OCDT_ELEMENT)) { /* Transform the linearized array index into a set of indices */ ocarrayindices(data->index, pattern->array.rank, pattern->array.sizes, indices); } else return OCTHROW(OC_EBADTYPE); return OCTHROW(OC_NOERR); }
OCerror ocdata_recordcount(OCstate* state, OCdata* data, size_t* countp) { OCASSERT(state != NULL); OCASSERT(data != NULL); OCASSERT(countp != NULL); if(data->pattern->octype != OC_Sequence || !fisset(data->datamode,OCDT_SEQUENCE)) return OCTHROW(OC_EBADTYPE); *countp = data->ninstances; return OC_NOERR; }