/*joinu from C. Hammond, from puddle.mit.edu 31 October 1996 r groman "It needs to be linked with outer.o (some variation - whatever you are calling yours) and jgofs.a which is usually in ../lib." */ #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 #define MAXSIZ 5000 int nlevels[2]; char names[2][NVAR][TOKEN]; int namesize=TOKEN; char values[NVAR][TOKEN]; char values2[MAXSIZ][TOKEN]; int valuesize=TOKEN; int nlines2,nv2; int handle[2]={ -1, -1}; int nt[2]; struct { int pntr,index,level; } v[NVAR],tempv; int match[NVAR]; int minlevelread; char comments[COMMSIZE]; int testline; int getrec(handle) int *handle; { int minlevel; minlevel=jdbreada_(handle,values,&valuesize); return minlevel; } int bufferin(handle,values,nv) int *handle; char values[][TOKEN]; int nv; { int linecnt,lev,i; while(lev=jdbreada_(handle,values[linecnt*nv],&valuesize)>=0){ for(i=0;i= 0) { v0=atof(values[i]); v1=atof(values2[match[i]+testline*nv2]); if (v0 != v1) break; }; if(i==nt[0])break; }; return testline==nlines2; } 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,j1,k,maxlev; 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;imaxlev)maxlev=v[k].level; v[k].index=0; v[k++].pntr=i; } else { j=jdblevel_(handle,&i); j1=jdblevel_(handle+1,match+i); v[k].level= j>=j1 ? j:j1; if(v[k].level>maxlev)maxlev=v[k].level; v[k].index=0; v[k++].pntr=i; }; for(i=0;imaxlev)maxlev=v[k].level; v[k].index=1; v[k++].pntr=i; }; for(i=0;iv[j].level){ tempv=v[i]; v[i]=v[j]; v[j]=tempv; }; ih=0; *ntotal=k; minlevelread=maxlev+1; nv2=nt[1]; nlines2=bufferin(handle+1,values2,nv2); return maxlev; } int eofflag=0; int ioreadrec_(level) int *level; /* Read record at appropriate level. Return 0 if end at that level. Return 1 if ok. */ { int level0,itest; if(eofflag) return 0; if(*level == minlevelread) {minlevelread++;return 1;} else if(*level > minlevelread) return 0; itest=1; while(itest){ level0=getrec(handle); if (level0<0){eofflag=1;return 0;}; if(level0 <= *level){ minlevelread=level0; itest=iotest(); }; }; if(minlevelread < *level) return 0; minlevelread++; return 1; } ioclose_() /* Close files */ { jdbclose_(handle); } iovalreal_(vn,f) int *vn; float *f; /* Return real value (f) for variable indexed by vn. -9999 for strings */ { char tmp[TOKEN]; strcpy(tmp,iovalstr_(vn)); 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; if(v[*vn].index) s=values2[v[*vn].pntr+testline*nv2]; else s=values[v[*vn].pntr]; strcpy(tmp,s+strspn(s," ")); } int iovarlevel_(vn) int *vn; /* Return level corresponding to variable indexed by vn. */ { return v[*vn].level; } int ioattrout_(vn) int *vn; /* 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[v[*vn].index][v[*vn].pntr]); } int iocommout_(s) char *s; { return 0; }