/* read dcb parameters --------------------------------------------------------- * read differential code bias (dcb) parameters * args : char *file I dcb parameters file (wild-card * expanded) * nav_t *nav IO navigation data * return : status (1:ok,0:error) * notes : currently only p1-c1 bias of code *.dcb file *-----------------------------------------------------------------------------*/ extern int readdcb(const char *file, nav_t *nav) { int i,j,n; char *efiles[MAXEXFILE]={0}; trace(3,"readdcb : file=%s\n",file); for (i=0;i<MAXSAT;i++) for (j=0;j<3;j++) { nav->cbias[i][j]=0.0; } for (i=0;i<MAXEXFILE;i++) { if (!(efiles[i]=(char *)malloc(1024))) { for (i--;i>=0;i--) free(efiles[i]); return 0; } } n=expath(file,efiles,MAXEXFILE); for (i=0;i<n;i++) { readdcbf(efiles[i],nav); } for (i=0;i<MAXEXFILE;i++) free(efiles[i]); return 1; }
/* read sbas message file ------------------------------------------------------ * read sbas message file * args : char *file I sbas message file (wind-card * is expanded) * int sel I sbas satellite prn number selection (0:all) * (gtime_t ts I start time) * (gtime_t te I end time ) * sbs_t *sbs IO sbas messages * return : number of sbas messages * notes : sbas message are appended and sorted. before calling the funciton, * sbs->n, sbs->nmax and sbs->msgs must be set properly. (initially * sbs->n=sbs->nmax=0, sbs->msgs=NULL) * only the following file extentions after wild card expanded are valid * to read. others are skipped * .sbs, .SBS, .ems, .EMS *-----------------------------------------------------------------------------*/ extern int sbsreadmsgt(const char *file, int sel, gtime_t ts, gtime_t te, sbs_t *sbs) { char *efiles[MAXEXFILE]={0},*ext; int i,n; trace(3,"sbsreadmsgt: file=%s sel=%d\n",file,sel); for (i=0;i<MAXEXFILE;i++) { if (!(efiles[i]=(char *)malloc(1024))) { for (i--;i>=0;i--) free(efiles[i]); return 0; } } /* expand wild card in file path */ n=expath(file,efiles,MAXEXFILE); for (i=0;i<n;i++) { if (!(ext=strrchr(efiles[i],'.'))) continue; if (strcmp(ext,".sbs")&&strcmp(ext,".SBS")&& strcmp(ext,".ems")&&strcmp(ext,".EMS")) continue; readmsgs(efiles[i],sel,ts,te,sbs); } for (i=0;i<MAXEXFILE;i++) free(efiles[i]); /* sort messages */ if (sbs->n>0) { qsort(sbs->msgs,sbs->n,sizeof(sbsmsg_t),cmpmsgs); } return sbs->n; }
/* expath() */ static void utest11(const char *path) { char s[32][256],*paths[32]; int i,n; for (i=0;i<32;i++) paths[i]=s[i]; n=expath(path,paths,32); printf("\npath =%s\n",path); printf("paths=\n"); for (i=0;i<n;i++) printf("%s\n",paths[i]); }
/* read ionex tec grid file ---------------------------------------------------- * read ionex ionospheric tec grid file * args : char *file I ionex tec grid file * (wind-card * is expanded) * nav_t *nav IO navigation data * nav->nt, nav->ntmax and nav->tec are modified * int opt I read option (1: no clear of tec data,0:clear) * return : none * notes : see ref [1] *-----------------------------------------------------------------------------*/ extern void readtec(const char *file, nav_t *nav, int opt) { FILE *fp; double lats[3]={0},lons[3]={0},hgts[3]={0},rb=0.0,nexp=-1.0; double dcb[MAXSAT]={0},rms[MAXSAT]={0}; int i,n; char *efiles[MAXEXFILE]; trace(3,"readtec : file=%s\n",file); /* clear of tec grid data option */ if (!opt) { free(nav->tec); nav->tec=NULL; nav->nt=nav->ntmax=0; } for (i=0;i<MAXEXFILE;i++) { if (!(efiles[i]=(char *)malloc(1024))) { for (i--;i>=0;i--) free(efiles[i]); return; } } /* expand wild card in file path */ n=expath(file,efiles,MAXEXFILE); for (i=0;i<n;i++) { if (!(fp=fopen(efiles[i],"r"))) { trace(2,"ionex file open error %s\n",efiles[i]); continue; } /* read ionex header */ if (readionexh(fp,lats,lons,hgts,&rb,&nexp,dcb,rms)<=0.0) { trace(2,"ionex file format error %s\n",efiles[i]); continue; } /* read ionex body */ readionexb(fp,lats,lons,hgts,rb,nexp,nav); fclose(fp); } for (i=0;i<MAXEXFILE;i++) free(efiles[i]); /* combine tec grid data */ if (nav->nt>0) combtec(nav); /* P1-P2 dcb */ for (i=0;i<MAXSAT;i++) { nav->cbias[i][0]=CLIGHT*dcb[i]*1E-9; /* ns->m */ } }
/* read sp3 precise ephemeris file --------------------------------------------- * read sp3 precise ephemeris/clock files and set them to navigation data * args : char *file I sp3-c precise ephemeris file * (wind-card * is expanded) * nav_t *nav IO navigation data * int opt I options (1: only observed, 2: only predicted) * return : none * notes : see ref [1] * precise ephemeris is appended and combined * nav->peph and nav->ne must by properly initialized before calling the * function * only files with extensions of .sp3, .SP3, .eph* and .EPH* are read *-----------------------------------------------------------------------------*/ extern void readsp3(const char *file, nav_t *nav, int opt) { FILE *fp; gtime_t time={0}; double bfact[2]={0}; int i,j,n,ns,sats[MAXSAT]={0}; char *efiles[MAXEXFILE],*ext,type=' ',tsys[4]=""; trace(3,"readpephs: file=%s\n",file); for (i=0;i<MAXEXFILE;i++) { if (!(efiles[i]=(char *)malloc(1024))) { for (i--;i>=0;i--) free(efiles[i]); return; } } /* expand wild card in file path */ n=expath(file,efiles,MAXEXFILE); for (i=j=0;i<n;i++) { if (!(ext=strrchr(efiles[i],'.'))) continue; if (strcmp (ext,".sp3" )&&strcmp (ext,".SP3" )&& strncmp(ext,".eph",4)&&strncmp(ext,".EPH",4)) continue; if (!(fp=fopen(efiles[i],"r"))) { trace(2,"sp3 file open error %s\n",efiles[i]); continue; } /* read sp3 header */ ns=readsp3h(fp,&time,&type,sats,bfact,tsys); /* read sp3 body */ readsp3b(fp,type,sats,ns,bfact,tsys,j++,opt,nav); fclose(fp); } for (i=0;i<MAXEXFILE;i++) free(efiles[i]); /* combine precise ephemeris */ if (nav->ne>0) combpeph(nav); }
/* read stec grid file --------------------------------------------------------- * read slant tec grid file * args : char *file I slant tec grid file * (wind-card * is expanded) * nav_t *nav IO navigation data * nav->nn, nav->nnmax and nav->stec are modified * return : none *-----------------------------------------------------------------------------*/ extern void stec_read(const char *file, nav_t *nav) { FILE *fp; int i,n; char *efiles[MAX_STECFILE]; trace(2,"stec_read: file=%s\n",file); stec_free(nav); for (i=0;i<MAX_STECFILE;i++) { if (!(efiles[i]=(char *)malloc(1024))) { for (i--;i>=0;i--) free(efiles[i]); return; } } /* expand wild card in file path */ n=expath(file,efiles,MAX_STECFILE); for (i=0;i<n;i++) { if (!(fp=fopen(efiles[i],"r"))) { trace(2,"stec grid file open error %s\n",efiles[i]); continue; } fprintf(stderr,"stec_read: %s\n",efiles[i]); /* read stec grid file */ read_stecb(fp,nav); fclose(fp); } for (i=0;i<MAX_STECFILE;i++) free(efiles[i]); /* sort stec data */ for (i=0;i<nav->nn;i++) { if (nav->stec[i].n<=0) continue; qsort(nav->stec[i].data,nav->stec[i].n,sizeof(stecd_t),comp_data); } }
/* set approx position -------------------------------------------------------*/ static void setapppos(strfile_t *str, rnxopt_t *opt) { prcopt_t prcopt=prcopt_default; sol_t sol={{0}}; char msg[128]; prcopt.navsys=opt->navsys; /* point positioning with last obs data */ #ifdef WAAS_STUDY if (!pntpos(str->obs->data,str->obs->n,str->nav,&prcopt,&sol,NULL,NULL, NULL,msg)) { #else if (!pntpos(str->obs->data,str->obs->n,str->nav,&prcopt,&sol,NULL,NULL, msg)) { #endif trace(2,"point position error (%s)\n",msg); return; } matcpy(opt->apppos,sol.rr,3,1); } /* show status message -------------------------------------------------------*/ static int showstat(int sess, gtime_t ts, gtime_t te, int *n) { const char type[]="ONGHQLSE"; char msg[1024]="",*p=msg,s[64]; int i; if (sess>0) { p+=sprintf(p,"(%d) ",sess); } if (ts.time!=0) { time2str(ts,s,0); p+=sprintf(p,"%s",s); } if (te.time!=0&&timediff(te,ts)>0.9) { time2str(te,s,0); p+=sprintf(p,"-%s",s+5); } p+=sprintf(p,": "); for (i=0;i<NOUTFILE+1;i++) { if (n[i]==0) continue; p+=sprintf(p,"%c=%d%s",type[i],n[i],i<NOUTFILE?" ":""); } return showmsg(msg); } /* rinex converter for single-session ----------------------------------------*/ static int convrnx_s(int sess, int format, rnxopt_t *opt, const char *file, char **ofile) { FILE *ofp[NOUTFILE]={NULL}; strfile_t *str; gtime_t ts={0},te={0},tend={0},time={0}; unsigned char slips[MAXSAT][NFREQ+NEXOBS]={{0}}; int i,j,nf,type,n[NOUTFILE+1]={0},abort=0; char path[1024],*paths[NOUTFILE],s[NOUTFILE][1024]; char *epath[MAXEXFILE]={0},*staid=*opt->staid?opt->staid:"0000"; trace(3,"convrnx_s: sess=%d format=%d file=%s ofile=%s %s %s %s %s %s %s\n", sess,format,file,ofile[0],ofile[1],ofile[2],ofile[3],ofile[4], ofile[5],ofile[6]); /* replace keywords in input file */ if (reppath(file,path,opt->ts,staid,"")<0) { showmsg("no time for input file: %s",file); return 0; } /* expand wild-cards in input file */ for (i=0;i<MAXEXFILE;i++) { if (!(epath[i]=(char *)malloc(1024))) { for (i=0;i<MAXEXFILE;i++) free(epath[i]); return 0; } } nf=expath(path,epath,MAXEXFILE); if (format==STRFMT_RTCM2||format==STRFMT_RTCM3) time=opt->trtcm; if (opt->scanobs) { /* scan observation types */ if (!scan_obstype(format,epath[0],opt,&time)) return 0; } else { /* set observation types by format */ set_obstype(format,opt); } if (!(str=gen_strfile(format,opt->rcvopt,time))) { for (i=0;i<MAXEXFILE;i++) free(epath[i]); return 0; } time=opt->ts.time?opt->ts:(time.time?timeadd(time,TSTARTMARGIN):time); /* replace keywords in output file */ for (i=0;i<NOUTFILE;i++) { paths[i]=s[i]; if (reppath(ofile[i],paths[i],time,staid,"")<0) { showmsg("no time for output path: %s",ofile[i]); for (i=0;i<MAXEXFILE;i++) free(epath[i]); free_strfile(str); return 0; } } /* open output files */ if (!openfile(ofp,paths,path,opt,str->nav)) { for (i=0;i<MAXEXFILE;i++) free(epath[i]); free_strfile(str); return 0; } for (i=0;i<nf&&!abort;i++) { /* open stream file */ if (!open_strfile(str,epath[i])) continue; /* input message */ for (j=0;(type=input_strfile(str))>=-1;j++) { if (j%11==1&&(abort=showstat(sess,te,te,n))) break; /* avioid duplicated if overlapped data */ if (tend.time&&timediff(str->time,tend)<=0.0) continue; /* convert message */ switch (type) { case 1: convobs(ofp,opt,str,n,slips); break; case 2: convnav(ofp,opt,str,n); break; case 3: convsbs(ofp,opt,str,n); break; case 31: convlex(ofp,opt,str,n); break; case -1: n[NOUTFILE]++; break; /* error */ } te=str->time; if (ts.time==0) ts=te; /* set approx position */ if (type==1&&!opt->autopos&&norm(opt->apppos,3)<=0.0) { setapppos(str,opt); } if (opt->te.time&&timediff(te,opt->te)>10.0) break; } /* close stream file */ close_strfile(str); tend=te; /* end time of a file */ } /* set receiver and antenna information to option */ if (format==STRFMT_RTCM2||format==STRFMT_RTCM3) { rtcm2opt(&str->rtcm,opt); } else if (format==STRFMT_RINEX) { rnx2opt(&str->rnx,opt); } /* close output files */ closefile(ofp,opt,str->nav); /* remove empty output files */ for (i=0;i<NOUTFILE;i++) { if (ofp[i]&&n[i]<=0) remove(ofile[i]); } if (ts.time>0) showstat(sess,ts,te,n); for (i=0;i<MAXEXFILE;i++) free(epath[i]); free_strfile(str); if (opt->tstart.time==0) opt->tstart=opt->ts; if (opt->tend .time==0) opt->tend =opt->te; return abort?-1:1; }
/* rinex converter for single-session ----------------------------------------*/ static int convrnx_s(int sess, int format, rnxopt_t *opt, const char *file, char **ofile) { FILE *ofp[NOUTFILE]={NULL}; strfile_t *str; gtime_t ts={0},te={0},tend={0},time={0}; unsigned char slips[MAXSAT][NFREQ+NEXOBS]={{0}}; int i,j,nf,type,n[NOUTFILE+1]={0},abort=0; char path[1024],*paths[NOUTFILE],s[NOUTFILE][1024]; char *epath[MAXEXFILE]={0},*staid=*opt->staid?opt->staid:"0000"; trace(3,"convrnx_s: sess=%d format=%d file=%s ofile=%s %s %s %s %s %s %s\n", sess,format,file,ofile[0],ofile[1],ofile[2],ofile[3],ofile[4], ofile[5],ofile[6]); /* replace keywords in input file */ if (reppath(file,path,opt->ts,staid,"")<0) { showmsg("no time for input file: %s",file); return 0; } /* expand wild-cards in input file */ for (i=0;i<MAXEXFILE;i++) { if (!(epath[i]=(char *)malloc(1024))) { for (i=0;i<MAXEXFILE;i++) free(epath[i]); return 0; } } nf=expath(path,epath,MAXEXFILE); if (format==STRFMT_RTCM2||format==STRFMT_RTCM3) time=opt->trtcm; if (opt->scanobs) { /* scan observation types */ if (!scan_obstype(format,epath[0],opt,&time)) return 0; } else { /* set observation types by format */ set_obstype(format,opt); } if (!(str=gen_strfile(format,opt->rcvopt,time))) { for (i=0;i<MAXEXFILE;i++) free(epath[i]); return 0; } time=opt->ts.time?opt->ts:(time.time?timeadd(time,TSTARTMARGIN):time); /* replace keywords in output file */ for (i=0;i<NOUTFILE;i++) { paths[i]=s[i]; if (reppath(ofile[i],paths[i],time,staid,"")<0) { showmsg("no time for output path: %s",ofile[i]); for (i=0;i<MAXEXFILE;i++) free(epath[i]); free_strfile(str); return 0; } } /* open output files */ if (!openfile(ofp,paths,path,opt,str->nav)) { for (i=0;i<MAXEXFILE;i++) free(epath[i]); free_strfile(str); return 0; } for (i=0;i<nf&&!abort;i++) { /* open stream file */ if (!open_strfile(str,epath[i])) continue; /* input message */ for (j=0;(type=input_strfile(str))>=-1;j++) { if (j%11==1&&(abort=showstat(sess,te,te,n))) break; /* avioid duplicated if overlapped data */ if (tend.time&&timediff(str->time,tend)<=0.0) continue; /* convert message */ switch (type) { case 1: convobs(ofp,opt,str,n,slips); break; case 2: convnav(ofp,opt,str,n); break; case 3: convsbs(ofp,opt,str,n); break; case 31: convlex(ofp,opt,str,n); break; case -1: n[NOUTFILE]++; break; /* error */ } te=str->time; if (ts.time==0) ts=te; /* set approx position */ if (type==1&&!opt->autopos&&norm(opt->apppos,3)<=0.0) { setapppos(str,opt); } if (opt->te.time&&timediff(te,opt->te)>10.0) break; } /* close stream file */ close_strfile(str); tend=te; /* end time of a file */ } /* set receiver and antenna information to option */ if (format==STRFMT_RTCM2||format==STRFMT_RTCM3) { rtcm2opt(&str->rtcm,opt); } else if (format==STRFMT_RINEX) { rnx2opt(&str->rnx,opt); } /* close output files */ closefile(ofp,opt,str->nav); /* remove empty output files */ for (i=0;i<NOUTFILE;i++) { if (ofp[i]&&n[i]<=0) remove(ofile[i]); } if (ts.time>0) showstat(sess,ts,te,n); for (i=0;i<MAXEXFILE;i++) free(epath[i]); free_strfile(str); if (opt->tstart.time==0) opt->tstart=opt->ts; if (opt->tend .time==0) opt->tend =opt->te; return abort?-1:1; }
/* analyize command line options ---------------------------------------------*/ static int cmdopts(int argc, char **argv, rnxopt_t *opt, char **ifile, char **ofile, char **dir) { double eps[]={1980,1,1,0,0,0},epe[]={2037,12,31,0,0,0}; double epr[]={2010,1,1,0,0,0}; int i,j,sat,nf=2,nc=2,format=-1; char *p,*sys,*fmt="",*paths[1],path[1024]; opt->rnxver =2.11; opt->obstype=OBSTYPE_PR|OBSTYPE_CP; opt->navsys =SYS_GPS|SYS_GLO|SYS_GAL|SYS_QZS|SYS_SBS|SYS_CMP; for (i=0;i<6;i++) for (j=0;j<64;j++) opt->mask[i][j]=1; for (i=1;i<argc;i++) { if (!strcmp(argv[i],"-ts")&&i+2<argc) { sscanf(argv[++i],"%lf/%lf/%lf",eps,eps+1,eps+2); sscanf(argv[++i],"%lf:%lf:%lf",eps+3,eps+4,eps+5); opt->ts=epoch2time(eps); } else if (!strcmp(argv[i],"-te")&&i+2<argc) { sscanf(argv[++i],"%lf/%lf/%lf",epe,epe+1,epe+2); sscanf(argv[++i],"%lf:%lf:%lf",epe+3,epe+4,epe+5); opt->te=epoch2time(epe); } else if (!strcmp(argv[i],"-tr")&&i+2<argc) { sscanf(argv[++i],"%lf/%lf/%lf",epr,epr+1,epr+2); sscanf(argv[++i],"%lf:%lf:%lf",epr+3,epr+4,epr+5); opt->trtcm=epoch2time(epr); } else if (!strcmp(argv[i],"-ti")&&i+1<argc) { opt->tint=atof(argv[++i]); } else if (!strcmp(argv[i],"-r" )&&i+1<argc) { fmt=argv[++i]; } else if (!strcmp(argv[i],"-ro")&&i+1<argc) { strcpy(opt->rcvopt,argv[++i]); } else if (!strcmp(argv[i],"-f" )&&i+1<argc) { nf=atoi(argv[++i]); } else if (!strcmp(argv[i],"-hc")&&i+1<argc) { if (nc<MAXCOMMENT) strcpy(opt->comment[nc++],argv[++i]); } else if (!strcmp(argv[i],"-hm")&&i+1<argc) { strcpy(opt->marker,argv[++i]); } else if (!strcmp(argv[i],"-hn")&&i+1<argc) { strcpy(opt->markerno,argv[++i]); } else if (!strcmp(argv[i],"-ht")&&i+1<argc) { strcpy(opt->markertype,argv[++i]); } else if (!strcmp(argv[i],"-ho")&&i+1<argc) { for (j=0,p=strtok(argv[++i],"/");j<2&&p;j++,p=strtok(NULL,"/")) { strcpy(opt->name[j],p); } } else if (!strcmp(argv[i],"-hr")&&i+1<argc) { for (j=0,p=strtok(argv[++i],"/");j<3&&p;j++,p=strtok(NULL,"/")) { strcpy(opt->rec[j],p); } } else if (!strcmp(argv[i],"-ha")&&i+1<argc) { for (j=0,p=strtok(argv[++i],"/");j<3&&p;j++,p=strtok(NULL,"/")) { strcpy(opt->ant[j],p); } } else if (!strcmp(argv[i],"-hp")&&i+1<argc) { for (j=0,p=strtok(argv[++i],"/");j<3&&p;j++,p=strtok(NULL,"/")) { opt->apppos[j]=atof(p); } } else if (!strcmp(argv[i],"-hd")&&i+1<argc) { for (j=0,p=strtok(argv[++i],"/");j<3&&p;j++,p=strtok(NULL,"/")) { opt->antdel[j]=atof(p); } } else if (!strcmp(argv[i],"-v" )&&i+1<argc) { opt->rnxver=atof(argv[++i]); } else if (!strcmp(argv[i],"-od")) { opt->obstype|=OBSTYPE_DOP; } else if (!strcmp(argv[i],"-os")) { opt->obstype|=OBSTYPE_SNR; } else if (!strcmp(argv[i],"-oi")) { opt->outiono=1; } else if (!strcmp(argv[i],"-ot")) { opt->outtime=1; } else if (!strcmp(argv[i],"-ol")) { opt->outleaps=1; } else if (!strcmp(argv[i],"-scan")) { opt->scanobs=1; } else if (!strcmp(argv[i],"-x" )&&i+1<argc) { if ((sat=satid2no(argv[++i]))) opt->exsats[sat-1]=1; } else if (!strcmp(argv[i],"-y" )&&i+1<argc) { sys=argv[++i]; if (!strcmp(sys,"G")) opt->navsys&=~SYS_GPS; else if (!strcmp(sys,"R")) opt->navsys&=~SYS_GLO; else if (!strcmp(sys,"E")) opt->navsys&=~SYS_GAL; else if (!strcmp(sys,"J")) opt->navsys&=~SYS_QZS; else if (!strcmp(sys,"S")) opt->navsys&=~SYS_SBS; else if (!strcmp(sys,"C")) opt->navsys&=~SYS_CMP; } else if (!strcmp(argv[i],"-d" )&&i+1<argc) { *dir=argv[++i]; } else if (!strcmp(argv[i],"-c" )&&i+1<argc) { strcpy(opt->staid,argv[++i]); } else if (!strcmp(argv[i],"-o" )&&i+1<argc) ofile[0]=argv[++i]; else if (!strcmp(argv[i],"-n" )&&i+1<argc) ofile[1]=argv[++i]; else if (!strcmp(argv[i],"-g" )&&i+1<argc) ofile[2]=argv[++i]; else if (!strcmp(argv[i],"-h" )&&i+1<argc) ofile[3]=argv[++i]; else if (!strcmp(argv[i],"-q" )&&i+1<argc) ofile[4]=argv[++i]; else if (!strcmp(argv[i],"-l" )&&i+1<argc) ofile[5]=argv[++i]; else if (!strcmp(argv[i],"-s" )&&i+1<argc) ofile[6]=argv[++i]; else if (!strncmp(argv[i],"-",1)) printhelp(); else *ifile=argv[i]; } if (nf>=1) opt->freqtype|=FREQTYPE_L1; if (nf>=2) opt->freqtype|=FREQTYPE_L2; if (nf>=3) opt->freqtype|=FREQTYPE_L5; if (nf>=4) opt->freqtype|=FREQTYPE_L6; if (nf>=5) opt->freqtype|=FREQTYPE_L7; if (nf>=6) opt->freqtype|=FREQTYPE_L8; if (*fmt) { if (!strcmp(fmt,"rtcm2")) format=STRFMT_RTCM2; else if (!strcmp(fmt,"rtcm3")) format=STRFMT_RTCM3; else if (!strcmp(fmt,"nov" )) format=STRFMT_OEM4; else if (!strcmp(fmt,"oem3" )) format=STRFMT_OEM3; else if (!strcmp(fmt,"ubx" )) format=STRFMT_UBX; else if (!strcmp(fmt,"ss2" )) format=STRFMT_SS2; else if (!strcmp(fmt,"hemis")) format=STRFMT_CRES; else if (!strcmp(fmt,"stq" )) format=STRFMT_STQ; else if (!strcmp(fmt,"javad")) format=STRFMT_JAVAD; else if (!strcmp(fmt,"nvs" )) format=STRFMT_NVS; else if (!strcmp(fmt,"binex")) format=STRFMT_BINEX; else if (!strcmp(fmt,"rinex")) format=STRFMT_RINEX; } else { paths[0]=path; if (!expath(*ifile,paths,1)||!(p=strrchr(path,'.'))) return -1; if (!strcmp(p,".rtcm2")) format=STRFMT_RTCM2; else if (!strcmp(p,".rtcm3")) format=STRFMT_RTCM3; else if (!strcmp(p,".gps" )) format=STRFMT_OEM4; else if (!strcmp(p,".ubx" )) format=STRFMT_UBX; else if (!strcmp(p,".log" )) format=STRFMT_SS2; else if (!strcmp(p,".bin" )) format=STRFMT_CRES; else if (!strcmp(p,".stq" )) format=STRFMT_STQ; else if (!strcmp(p,".jps" )) format=STRFMT_JAVAD; else if (!strcmp(p,".bnx" )) format=STRFMT_BINEX; else if (!strcmp(p,".binex")) format=STRFMT_BINEX; else if (!strcmp(p,".obs" )) format=STRFMT_RINEX; else if (!strcmp(p+3,"o" )) format=STRFMT_RINEX; else if (!strcmp(p+3,"O" )) format=STRFMT_RINEX; } return format; }