/***********************************************************************/ /* Open Visualization Data Explorer */ /* (C) Copyright IBM Corp. 1989,1999 */ /* ALL RIGHTS RESERVED */ /* This code licensed under the */ /* "IBM PUBLIC LICENSE - Open Visualization Data Explorer" */ /***********************************************************************/ #include #include "interact.h" extern _dxfaxes_delta(float *, float *, float, int *, float *, float *, char *, int *, int, int); static Error _dxfgetdelta(method_type,float ,float ,float *); static Error getdec(float ,float ,float ,int *); extern Error _dxfinteract_float(char *id,Object idobj,float *min,float *max,\ float *incr,int *decimal,char *label,int pos,method_type method,int *items, int iprint[]) { int i; Array temp; float *old,valtemp; Private p; char *cache_label = NULL; char *old_label; for (i=0; i1) {sprintf(ep->mp,"{"); ep->mp++;} for (i=0; i=1){ if (type==TYPE_STRING) {sprintf(ep->mp,"\""); ep->mp++;} else {sprintf(ep->mp,"["); ep->mp++;} } for (k=0; k 1) {sprintf(ep->mp,"["); ep->mp++;} switch(type){ case TYPE_INT: for (j=0; jmp,"%d ",((int *)dp)[offset]); while(*ep->mp) ep->mp++; offset++; } break; case TYPE_FLOAT: for (j=0; jmp,"%.8g ",((float *)dp)[offset]);while(*ep->mp) ep->mp++; offset++; } break; case TYPE_STRING: if ((dim[k] + ep->mp - ep->msgbuf) >= ep->maxlen) { DXSetError(ERROR_INTERNAL,"too many items in list"); return ERROR; } for (j=0; jmp,"%%%%"); break; /* the printf conversion char */ #ifndef DXD_NO_ANSI_ALERT case '\a': sprintf(ep->mp,"\\a"); break; /* attention (bell) */ #endif case '\b': sprintf(ep->mp,"\\b"); break; /* backspace */ case '\f': sprintf(ep->mp,"\\f"); break; /* formfeed */ case '\n': sprintf(ep->mp,"\\n"); break; /* newline */ case '\r': sprintf(ep->mp,"\\r"); break; /* carriage return */ case '\t': sprintf(ep->mp,"\\t"); break; /* horizontal tab */ case '\v': sprintf(ep->mp,"\\v"); break; /* vertical tab */ case '\\': sprintf(ep->mp,"\\\\"); break; /* backslash */ case '"': sprintf(ep->mp,"\\\""); break; /* double quote */ /* case '\0': sprintf(ep->mp,"\\0"); break; NULL */ default: sprintf(ep->mp,"%c",c); } while(*ep->mp) ep->mp++; offset++; } break; default: DXErrorReturn(ERROR_BAD_TYPE,"unsupported type"); } if (rank > 1) {sprintf(ep->mp,"]"); ep->mp++;} } if (rank>=1){ if (type==TYPE_STRING) {sprintf(ep->mp,"\""); ep->mp++;} else {sprintf(ep->mp,"]"); ep->mp++;} } sprintf(ep->mp," "); ep->mp++; if (EndCheck(ep)) return ERROR; } if (item>1) {sprintf(ep->mp,"}"); ep->mp++;} return OK; } extern int _dxfcheck_obj_cache(Object obj,char *id,int key,Object idobj) { Object temp_obj; int remap=0; char *cache_label = NULL; cache_label = (char *)DXAllocate(strlen(id) + 32); if (! cache_label) goto error; strcpy(cache_label,id); strcat(cache_label,"_object"); temp_obj = DXGetCacheEntry(cache_label,key,1,idobj); if (!temp_obj){ if (obj) remap=2; /* DXWarning("object is new, %d,exist=%d",key,remap); */ temp_obj=obj; DXSetCacheEntry(temp_obj,CACHE_PERMANENT,cache_label,key,1,idobj); } else{ if (obj!=temp_obj){ /* DXWarning("group object has changed,%d",key); */ remap=1; DXDelete(temp_obj); temp_obj=obj; /* DXReference(temp_obj); */ DXSetCacheEntry(temp_obj,CACHE_PERMANENT,cache_label,key,1,idobj); } else DXDelete(temp_obj); } /* DXDelete(temp_obj); */ DXFree(cache_label); return remap; error: DXFree(cache_label); return NULL; } extern int EndCheck(struct einfo *ep) { if (ep->atend) return 1; if ((ep->mp - ep->msgbuf) >= ep->maxlen) { ep->atend = 1; DXSetError(ERROR_INVALID_DATA,"msg too long"); return 1; } return 0; } static Error _dxfgetdelta(method_type method,float min, float max, float *incr) { int n=100,sub=0; float delta=0,lo=0,fuzz; char fmt[20]; float range,start=0; switch(method){ case(PERCENT_ROUND): if (*incr>0){ range = max-min; fuzz = *incr * .1; n = (int)(1.0/ (*incr-fuzz)); _dxfaxes_delta(&start,&range,1,&n,&lo,&delta,fmt,&sub,0,0); *incr=delta; } else *incr=0; break; case(PERCENT): delta = *incr *(max-min); *incr = delta; break; } return OK; } static Error getdec(float min,float max,float incr, int *dec) { float s; s = max-min; /* always scientific notation */ if (s>1000000.0 || s<0.000001){ if (incr>0) *dec =(int)(log10(s) +0.99999)-(int)(log10(incr) +0.99999); else{ if (s==0.0) *dec=0; else *dec = (int)log10(s); } } else if (incr > 0.0 && incr < 1.0) *dec =(int)( -log10(incr)+0.99999); else if (incr == 0) *dec = 5; else *dec = 0; if (*dec > 6) *dec = 6; return OK; }