/* Module To Interface C I/O to Fortran */ #include <stdio.h> #if(SIZEOF_SHORT==4) #define fint4 short #elif(SIZEOF_INT==4) #define fint4 int #elif(SIZEOF_LONG==4) #define fint4 long #else #define fint4 int #endif #ifdef FORTRANCAPS #define read_binary_field READ_BINARY_FIELD #define in_to_im IN_TO_IM #endif #ifdef UNDERSCORE #define read_binary_field read_binary_field_ #define in_to_im in_to_im_ #endif #ifdef DOUBLEUNDERSCORE #define read_binary_field read_binary_field__ #define in_to_im in_to_im__ #endif #define swap2(x) ((((x)>>8)&255)|(((x)&255)<<8)) int read_binary_field(char *data, fint4 *in_size, fint4 *out_size, fint4 *nitems, char *fname, fint4 *len) { FILE *fp; int cnt; fname[*len]='\0'; fp = fopen(fname,"rb"); cnt = fread(data,(*in_size),(*nitems),fp); fclose(fp); if(cnt != (*nitems)){ fprintf(stderr,"Failed to read number of expected items in read_binary_field %d %d\n", *nitems,cnt); return -1; } cnt = in_to_im(in_size,out_size,data,nitems); return(cnt); } /* translates a field of integer*n to a field of integer*m given that m>= n */ int in_to_im(fint4 *insize, fint4 *outsize,char *data, fint4 *nitems) { int i,n,m; int *j; short *k; if(*insize == *outsize) return 0; if(*insize > *outsize) return -1; n = (*insize); m = (*outsize); if(n==sizeof(short) && m==sizeof(fint4)){ j = (fint4 *) data; k = (short *) data; for(i=(*nitems)-1;i>=0;i--) #ifdef WORDS_BIGENDIAN j[i]=(fint4) k[i]; #else j[i]=(fint4) swap2(k[i]); #endif return 0; } if(n==sizeof(char) && m==sizeof(fint4)){ j = (fint4 *) data; for(i=(*nitems)-1;i>=0;i--) j[i]=(fint4) data[i]; return 0; } fprintf(stderr,"Failed to find type match in in_to_im %d %d\n",m,n); return -1; } int in_to_fm(fint4 *insize, fint4 *outsize,char *data, fint4 *nitems) { int j,n,m; short *s; int *i; float *f; double *d; if(*insize == *outsize) return 0; if(*insize > *outsize) return -1; n = (*insize); m = (*outsize); if(n==sizeof(short) && m==sizeof(float)){ s = (short *) data; f = (float *) data; for(j=(*nitems)-1;j>=0;j--) f[j]=(float) s[j]; return 0; } if(n==sizeof(char) && m==sizeof(float)){ f = (float *) data; for(j=(*nitems)-1;j>=0;j--) f[j]=(float) data[j]; return 0; } if(n==sizeof(short) && m==sizeof(double)){ s = (short *) data; d = (double *) data; for(j=(*nitems)-1;j>=0;j--) d[j]=(double) s[j]; return 0; } if(n==sizeof(char) && m==sizeof(double)){ d = (double *) data; for(j=(*nitems)-1;j>=0;j--) d[j]=(double) data[j]; return 0; } fprintf(stderr,"Failed to find type match in in_to_fm %d %d\n",m,n); return -1; }