#if HP || IBM #define jdbopen_ jdbopen #define jdbreada_ jdbreada #define jdbread_ jdbread #define jdbclose_ jdbclose #define jdbcomments_ jdbcomments #define jdblevel_ jdblevel #define jdbattributes_ jdbattributes #endif #include #include double atof(); #include /* #define DEBUG */ #define TOKEN 40 #define NVAR 50 #define COMMSIZE 2048 int nlevels[2]; int firstvar[2][6]; char names[2][NVAR][TOKEN]; int namesize=TOKEN; char values[2][NVAR][TOKEN]; int valuesize=TOKEN; int handle[2]={-1,-1}; int nt[2]; int pcnt=0; int vpntr[NVAR],vindex[NVAR],vlevel[NVAR]; int match[NVAR]; int minlevelread; char comments[COMMSIZE]; int iotest() { int i,k; float v0,v1; k=0; for(i=0;i= 0) { v0=atof(values[0][i]); v1=atof(values[1][match[i]]); if (v0v1) k=1+vlevel[i]; }; return k; } int ioopen_(params,nparams,ntotal) char *params[]; int *nparams,*ntotal; /* s[0..nparams-1]: parameter strings. Inner sets s[j][0]=0 for any strings which it processes; others will be processed by outer. Thus selection/projections would normally be ignored by inner. nparams: number of parameter strings ntotal (returned): total number of variable names */ { char tmp[1024]; int i,j,k; int ih; putenv("QUERY_STRING="); strcpy(comments,"join"); for (ih=0;ih<=1;ih++){ strcpy(tmp,params[ih]); strcat(comments," ");strcat(comments,params[ih]); nt[ih]= -NVAR; nlevels[ih]=jdbopen_(handle+ih,tmp,names[ih],&namesize,nt+ih); if (nlevels[ih]<0){printf("&x error Bad Object: %s\n",params[ih]); exit(1);}; params[ih][0]=0; }; for(i=0;i minlevelread) return 0; iret0=jdbreada_(handle,values[0],&valuesize); if(iret0<0){eofflag=1;return 0;}; iret1=jdbreada_(handle+1,values[1],&valuesize); if(iret0<0){eofflag=1;return 0;}; if(iret0 < minlevelread)minlevelread=iret0; do { itest=iotest(); if (itest<0){ iret0=jdbreada_(handle,values[0],&valuesize); if (iret0<0){eofflag=1;return 0;}; if(iret0 < minlevelread)minlevelread=iret0;} else if(itest>0){ iret1=jdbreada_(handle+1,values[1],&valuesize); if (iret1<0){eofflag=1;return 0;};}; } while (itest); if(minlevelread < *level) return 0; minlevelread++; return 1; } ioclose_() /* Close files */ { jdbclose_(handle); jdbclose_(handle+1); } iovalreal_(vn,f) int *vn; float *f; /* Return real value (f) for variable indexed by vn. -9999 for strings */ { char tmp[TOKEN]; iovalstr_(vn,tmp); if(strspn(tmp,"0123456789.+-")) *f=atof(tmp); else *f=-9999.0; } iovalstr_(vn,tmp) int *vn; char *tmp; /* Return string value (tmp) for variable indexed by vn. */ { char *s; s=values[vindex[*vn]][vpntr[*vn]]; strcpy(tmp,s+strspn(s," ")); } int iovarlevel_(vn) int *vn; /* Return level corresponding to variable indexed by vn. */ { return vlevel[*vn]; } ioattrout_(vn,str) int *vn; char *str; /* Output attributes for variable indexed by vn. */ { return 0; } ioname_(vn,s) int *vn; char *s; /* Return name (s) corresponding to variable number vn. */ { strcpy(s,names[vindex[*vn]][vpntr[*vn]]); } int iocommout_(s) char *s; { return 0; }