static void set_zone(int in, struct IO_CON *io) { char tmp[20]; if (io->hp) { io->t83 = 1; if (!(htab = nad_init(io->hp))) emess(1,"hp datum file: %s, failed: %s", io->hp, pj_strerrno(pj_errno)); } if (io->zone > 0) { if (io->zone <= 60) { /* UTM zone */ io->nprojc = 2; /* no other options allowed */ io->projc[0] = "proj=utm"; sprintf(tmp, "zone=%d", io->zone); io->projc[1] = io->t83 ? "ellps=GRS80" : "ellps=clrk66"; } else /* SPCS zone */ sprintf(tmp, "init=nad%s:%d", io->t83 ? "83" : "27", io->zone); io->projc[io->nprojc++] = tmp; io->projc[io->nprojc++] = "no_defs"; if (!(io->cnv = pj_init(io->nprojc, io->projc))) emess(1,pj_strerrno(pj_errno)); io->ll = 0; } }
static void set_ops(char *s, struct IO_CON *io) { char *intag; struct TAG_LIST *p; for ( ; intag = strtok(s, " ,\t"); s = 0) { for (p = ops_list; p->tag; ++p) { if (!strncmp(intag, p->tag, strlen(p->tag))) break; } if (!p->tag) emess(1,"invalid selection"); switch (p->sw) { case 0: case 1: s = strchr(intag, '=') + 1; io->zone = atoi(s); break; case 2: if (io->zone <= 60) emess(1,"spcs zone must be selected"); io->projc[io->nprojc++] = "units=us-ft"; break; case 3: io->t83 = 0; break; case 4: io->t83 = 1; break; case 5: if (!(intag = strchr(intag, '=')) || *++intag == '\0') emess(1,"hp missing name"); strcpy(io->hp = (char*)malloc(strlen(intag)+1), intag); break; case 6: io->bin = 1; break; case 7: io->rev = 1; break; } } }
static void setup() { /* check and set zone operations */ if (input.hp && output.hp) emess(1,"both input and output cannot be high precision"); set_zone(1, &input); set_zone(0, &output); if (input.cnv && !output.cnv) output.ll = 1; if (output.cnv && !input.cnv) input.ll = 1; if (!input.cnv && !output.cnv) output.ll = input.ll = 1; if (czone) { if (!input.hp && !output.hp && input.t83 == output.t83) emess(1,"identical datums"); if (!(ctab = nad_init(czone))) emess(1,"datum file: %s, failed: %s", czone, pj_strerrno(pj_errno)); } else if (input.t83 != output.t83) emess(1,"conversion region (-r) not specified"); }
void geod_set(int argc, char **argv) { paralist *start = 0, *curr; double es; char *name; int i; /* put arguments into internal linked list */ if (argc <= 0) emess(1, "no arguments in initialization list"); start = curr = pj_mkparam(argv[0]); for (i = 1; i < argc; ++i) { curr->next = pj_mkparam(argv[i]); curr = curr->next; } /* set elliptical parameters */ if (pj_ell_set(pj_get_default_ctx(),start, &geod_a, &es)) emess(1,"ellipse setup failure"); /* set units */ if ((name = pj_param(NULL,start, "sunits").s) != NULL) { char *s; struct PJ_UNITS *unit_list = pj_get_units_ref(); for (i = 0; (s = unit_list[i].id) && strcmp(name, s) ; ++i) ; if (!s) emess(1,"%s unknown unit conversion id", name); fr_meter = 1. / (to_meter = atof(unit_list[i].to_meter)); } else to_meter = fr_meter = 1.; geod_f = es/(1 + sqrt(1 - es)); geod_ini(); /* check if line or arc mode */ if (pj_param(NULL,start, "tlat_1").i) { double del_S; #undef f phi1 = pj_param(NULL,start, "rlat_1").f; lam1 = pj_param(NULL,start, "rlon_1").f; if (pj_param(NULL,start, "tlat_2").i) { phi2 = pj_param(NULL,start, "rlat_2").f; lam2 = pj_param(NULL,start, "rlon_2").f; geod_inv(); geod_pre(); } else if ((geod_S = pj_param(NULL,start, "dS").f) != 0.) { al12 = pj_param(NULL,start, "rA").f; geod_pre(); geod_for(); } else emess(1,"incomplete geodesic/arc info"); if ((n_alpha = pj_param(NULL,start, "in_A").i) > 0) { if (!(del_alpha = pj_param(NULL,start, "rdel_A").f)) emess(1,"del azimuth == 0"); } else if ((del_S = fabs(pj_param(NULL,start, "ddel_S").f)) != 0.) { n_S = (int)(geod_S / del_S + .5); } else if ((n_S = pj_param(NULL,start, "in_S").i) <= 0) emess(1,"no interval divisor selected"); } /* free up linked list */ for ( ; start; start = curr) { curr = start->next; pj_dalloc(start); } }
void main(int argc, char **argv) { char *arg, **eargv = argv, work[MAX_PARGS]; FILE *fid; int eargc = 0, c; if (emess_dat.Prog_name = strrchr(*argv,DIR_CHAR)) ++emess_dat.Prog_name; else emess_dat.Prog_name = *argv; if (argc <= 1 ) { (void)fprintf(stderr, usage, pj_release, emess_dat.Prog_name); exit (0); } /* process run line arguments */ while (--argc > 0) { /* collect run line arguments */ if(**++argv == '-') for(arg = *argv;;) { switch(*++arg) { case '\0': /* position of "stdin" */ if (arg[-1] == '-') eargv[eargc++] = "-"; break; case 'i': /* input control */ case 'o': /* output control */ if (--argc <= 0) goto noargument; strncpy(work, *++argv, MAX_PARGS); set_ops(work, *arg == 'i' ? &input : &output); continue; case 'r': /* nad27/83 conversion zone */ if (--argc <= 0) goto noargument; czone = *++argv; continue; case 'E': /* echo ascii input to ascii output */ echoin = 1; continue; case 't': /* set col. one char */ if (arg[1]) tag = *++arg; else emess(1,"missing -t col. 1 tag"); continue; case 'W': /* specify seconds precision */ case 'w': /* -W for constant field width */ if ((c = arg[1]) != 0 && isdigit(c)) { set_rtodms(c - '0', *arg == 'W'); ++arg; } else emess(1,"-W argument missing or non-digit"); continue; case 'f': /* alternate output format degrees or xy */ if (--argc <= 0) goto noargument; oform = *++argv; continue; case 'e': /* error line alternative */ if (--argc <= 0) noargument: emess(1,"missing argument for -%c",*arg); oterr = *++argv; continue; default: emess(1, "invalid option: -%c",*arg); break; } break; } else /* assumed to be input file name(s) */ eargv[eargc++] = *argv; } if (eargc == 0) /* if no specific files force sysin */ eargv[eargc++] = "-"; /* done with parameter and control input */ setup(); /* process input file list */ for ( ; eargc-- ; ++eargv) { if (**eargv == '-') { fid = stdin; emess_dat.File_name = "<stdin>"; } else { if ((fid = fopen(*eargv, "r")) == NULL) { emess(-2, *eargv, "input file"); continue; } emess_dat.File_name = *eargv; } emess_dat.File_line = 0; /* process file */ process(fid); (void)fclose(fid); emess_dat.File_name = 0; } exit(0); /* normal completion */ }
int main(int argc, char **argv) { char *arg, **eargv = argv, *from_argv[MAX_PARGS], *to_argv[MAX_PARGS], **iargv = argv; FILE *fid; int from_argc=0, to_argc=0, iargc = argc, eargc = 0, c, mon = 0; int have_to_flag = 0, inverse = 0, i; if (emess_dat.Prog_name = strrchr(*argv,DIR_CHAR)) ++emess_dat.Prog_name; else emess_dat.Prog_name = *argv; inverse = ! strncmp(emess_dat.Prog_name, "inv", 3); if (argc <= 1 ) { (void)fprintf(stderr, usage, pj_get_release(), emess_dat.Prog_name); exit (0); } /* process run line arguments */ while (--argc > 0) { /* collect run line arguments */ if(**++argv == '-') for(arg = *argv;;) { switch(*++arg) { case '\0': /* position of "stdin" */ if (arg[-1] == '-') eargv[eargc++] = "-"; break; case 'v': /* monitor dump of initialization */ mon = 1; continue; case 'I': /* alt. method to spec inverse */ inverse = 1; continue; case 'E': /* echo ascii input to ascii output */ echoin = 1; continue; case 't': /* set col. one char */ if (arg[1]) tag = *++arg; else emess(1,"missing -t col. 1 tag"); continue; case 'l': /* list projections, ellipses or units */ if (!arg[1] || arg[1] == 'p' || arg[1] == 'P') { /* list projections */ struct PJ_LIST *lp; int do_long = arg[1] == 'P', c; char *str; for (lp = pj_get_list_ref() ; lp->id ; ++lp) { (void)printf("%s : ", lp->id); if (do_long) /* possibly multiline description */ (void)puts(*lp->descr); else { /* first line, only */ str = *lp->descr; while ((c = *str++) && c != '\n') putchar(c); putchar('\n'); } } } else if (arg[1] == '=') { /* list projection 'descr' */ struct PJ_LIST *lp; arg += 2; for (lp = pj_get_list_ref() ; lp->id ; ++lp) if (!strcmp(lp->id, arg)) { (void)printf("%9s : %s\n", lp->id, *lp->descr); break; } } else if (arg[1] == 'e') { /* list ellipses */ struct PJ_ELLPS *le; for (le = pj_get_ellps_ref(); le->id ; ++le) (void)printf("%9s %-16s %-16s %s\n", le->id, le->major, le->ell, le->name); } else if (arg[1] == 'u') { /* list units */ struct PJ_UNITS *lu; for (lu = pj_get_units_ref(); lu->id ; ++lu) (void)printf("%12s %-20s %s\n", lu->id, lu->to_meter, lu->name); } else if (arg[1] == 'd') { /* list datums */ struct PJ_DATUMS *ld; printf("__datum_id__ __ellipse___ __definition/comments______________________________\n" ); for (ld = pj_get_datums_ref(); ld->id ; ++ld) { printf("%12s %-12s %-30s\n", ld->id, ld->ellipse_id, ld->defn); if( ld->comments != NULL && strlen(ld->comments) > 0 ) printf( "%25s %s\n", " ", ld->comments ); } } else if( arg[1] == 'm') { /* list prime meridians */ struct PJ_PRIME_MERIDIANS *lpm; for (lpm = pj_get_prime_meridians_ref(); lpm->id ; ++lpm) (void)printf("%12s %-30s\n", lpm->id, lpm->defn); } else emess(1,"invalid list option: l%c",arg[1]); exit(0); continue; /* artificial */ case 'e': /* error line alternative */ if (--argc <= 0) noargument: emess(1,"missing argument for -%c",*arg); oterr = *++argv; continue; case 'W': /* specify seconds precision */ case 'w': /* -W for constant field width */ if ((c = arg[1]) != 0 && isdigit(c)) { set_rtodms(c - '0', *arg == 'W'); ++arg; } else emess(1,"-W argument missing or non-digit"); continue; case 'f': /* alternate output format degrees or xy */ if (--argc <= 0) goto noargument; oform = *++argv; continue; case 'r': /* reverse input */ reversein = 1; continue; case 's': /* reverse output */ reverseout = 1; continue; default: emess(1, "invalid option: -%c",*arg); break; } break; } else if (strcmp(*argv,"+to") == 0 ) { have_to_flag = 1; } else if (**argv == '+') { /* + argument */ if( have_to_flag ) { if( to_argc < MAX_PARGS ) to_argv[to_argc++] = *argv + 1; else emess(1,"overflowed + argument table"); } else { if (from_argc < MAX_PARGS) from_argv[from_argc++] = *argv + 1; else emess(1,"overflowed + argument table"); } } else /* assumed to be input file name(s) */ eargv[eargc++] = *argv; } if (eargc == 0 ) /* if no specific files force sysin */ eargv[eargc++] = "-"; /* * If the user has requested inverse, then just reverse the * coordinate systems. */ if( inverse ) { int argcount; for( i = 0; i < MAX_PARGS; i++ ) { char *arg; arg = from_argv[i]; from_argv[i] = to_argv[i]; to_argv[i] = arg; } argcount = from_argc; from_argc = to_argc; to_argc = argcount; } if (!(fromProj = pj_init(from_argc, from_argv))) { printf( "Using from definition: " ); for( i = 0; i < from_argc; i++ ) printf( "%s ", from_argv[i] ); printf( "\n" ); emess(3,"projection initialization failure\ncause: %s", pj_strerrno(pj_errno)); } if( to_argc == 0 ) { if (!(toProj = pj_latlong_from_proj( fromProj ))) { printf( "Using to definition: " ); for( i = 0; i < to_argc; i++ ) printf( "%s ", to_argv[i] ); printf( "\n" ); emess(3,"projection initialization failure\ncause: %s", pj_strerrno(pj_errno)); } } else if (!(toProj = pj_init(to_argc, to_argv))) { printf( "Using to definition: " ); for( i = 0; i < to_argc; i++ ) printf( "%s ", to_argv[i] ); printf( "\n" ); emess(3,"projection initialization failure\ncause: %s", pj_strerrno(pj_errno)); } if (mon) { printf( "%c ---- From Coordinate System ----\n", tag ); pj_pr_list(fromProj); printf( "%c ---- To Coordinate System ----\n", tag ); pj_pr_list(toProj); } /* set input formating control */ if( !fromProj->is_latlong ) informat = strtod; else { informat = dmstor; } if( !toProj->is_latlong && !oform ) oform = "%.2f"; /* process input file list */ for ( ; eargc-- ; ++eargv) { if (**eargv == '-') { fid = stdin; emess_dat.File_name = "<stdin>"; } else { if ((fid = fopen(*eargv, "rt")) == NULL) { emess(-2, *eargv, "input file"); continue; } emess_dat.File_name = *eargv; } emess_dat.File_line = 0; process(fid); fclose(fid); emess_dat.File_name = 0; } if( fromProj != NULL ) pj_free( fromProj ); if( toProj != NULL ) pj_free( toProj ); pj_deallocate_grids(); exit(0); /* normal completion */ }
void gen_cheb(int inverse, projUV (*proj)(projUV), char *s, PJ *P, int iargc, char **iargv) { int NU = 15, NV = 15, i, res = -1, errin = 0, pwr; char *arg, fmt[15]; projUV low, upp, resid; Tseries *F; extern void p_series(Tseries *, FILE *, char *); double (*input)(const char *, char **); input = inverse ? strtod : dmstor; if (*s) low.u = input(s, &s); else ++errin; if (*s == ',') upp.u = input(s+1, &s); else ++errin; if (*s == ',') low.v = input(s+1, &s); else ++errin; if (*s == ',') upp.v = input(s+1, &s); else ++errin; if (errin) emess(16,"null or absent -T parameters"); if (*s == ',') if (*++s != ',') res = strtol(s, &s, 10); if (*s == ',') if (*++s != ',') NU = strtol(s, &s, 10); if (*s == ',') if (*++s != ',') NV = strtol(s, &s, 10); pwr = s && *s && !strcmp(s, ",P"); (void)printf("#proj_%s\n# run-line:\n", pwr ? "Power" : "Chebyshev"); if (iargc > 0) { /* proj execution audit trail */ int n = 0, L; for( i = 0 ; iargc ; --iargc) { arg = *iargv++; if (*arg != '+') { if (!n) { putchar('#'); ++n; } //(void)printf(" %s%n",arg, &L); L = printf(" %s",arg); if ((n += L) > 50) { putchar('\n'); n = 0; } } } if (n) putchar('\n'); } (void)printf("# projection parameters\n"); pj_pr_list(P); if (low.u == upp.u || low.v >= upp.v) emess(16,"approx. argument range error"); if (low.u > upp.u) low.u -= TWOPI; if (NU < 2 || NV < 2) emess(16,"approx. work dimensions (%d %d) too small",NU,NV); if (!(F = mk_cheby(low, upp, pow(10., (double)res)*.5, &resid, proj, NU, NV, pwr))) emess(16,"generation of approx failed\nreason: %s\n", pj_strerrno(errno)); (void)printf("%c,%.12g,%.12g,%.12g,%.12g,%.12g\n",inverse?'I':'F', P->lam0*RAD_TO_DEG, low.u*(inverse?1.:RAD_TO_DEG),upp.u*(inverse?1.:RAD_TO_DEG), low.v*(inverse?1.:RAD_TO_DEG),upp.v*(inverse?1.:RAD_TO_DEG)); if (pwr) strcpy(fmt, "%.15g"); else if (res <= 0) (void)sprintf(fmt,"%%.%df",-res+1); else (void)strcpy(fmt,"%.0f"); p_series(F, stdout, fmt); (void)printf("# |u,v| sums %g %g\n#end_proj_%s\n", resid.u, resid.v, pwr ? "Power" : "Chebyshev"); }
static void process(FILE *fid) { char line[MAX_LINE + 3], *s, pline[40]; projUV data; for (;;) { double z; ++emess_dat.File_line; if (!(s = fgets(line, MAX_LINE, fid))) break; if (!strchr(s, '\n')) { /* overlong line */ int c; (void)strcat(s, "\n"); /* gobble up to newline */ while ((c = fgetc(fid)) != EOF && c != '\n') ; } if (*s == tag) { fputs(line, stdout); continue; } if (reversein) { data.v = (*informat)(s, &s); data.u = (*informat)(s, &s); } else { data.u = (*informat)(s, &s); data.v = (*informat)(s, &s); } z = strtod(s, &s); if (data.v == HUGE_VAL) data.u = HUGE_VAL; if (!*s && (s > line)) --s; /* assumed we gobbled \n */ if (echoin) { int t; t = *s; *s = '\0'; (void)fputs(line, stdout); *s = t; putchar('\t'); } if (data.u != HUGE_VAL) { if (pj_transform(fromProj, toProj, 1, 0, &(data.u), &(data.v), &z) != 0) { data.u = HUGE_VAL; data.v = HUGE_VAL; emess(-3, "pj_transform(): %s", pj_strerrno(pj_errno)); } } if (data.u == HUGE_VAL) /* error output */ fputs(oterr, stdout); else if (pj_is_latlong(toProj) && !oform) { /*ascii DMS output */ if (reverseout) { fputs(rtodms(pline, data.v, 'N', 'S'), stdout); putchar('\t'); fputs(rtodms(pline, data.u, 'E', 'W'), stdout); } else { fputs(rtodms(pline, data.u, 'E', 'W'), stdout); putchar('\t'); fputs(rtodms(pline, data.v, 'N', 'S'), stdout); } } else { /* x-y or decimal degree ascii output */ if (pj_is_latlong(toProj)) { data.v *= RAD_TO_DEG; data.u *= RAD_TO_DEG; } if (reverseout) { printf(oform, data.v); putchar('\t'); printf(oform, data.u); } else { printf(oform, data.u); putchar('\t'); printf(oform, data.v); } } putchar(' '); if (oform != NULL) printf(oform, z); else printf("%.3f", z); if (s) printf("%s", s); else printf("\n"); } }
void geod_set(int argc, char **argv) { paralist *start = 0, *curr = NULL; /* added NULL */ double es; char *name; int i; /* * put arguments into internal linked list */ if (argc <= 0) emess(1, "no arguments in initialization list"); for (i = 0; i < argc; ++i) if (i) curr = curr->next = pj_mkparam(argv[i]); else start = curr = pj_mkparam(argv[i]); /* * set elliptical parameters */ if (pj_ell_set(start, &geod_a, &es)) emess(1, "ellipse setup failure"); /* * set units */ if ((name = pj_param(start, "sunits").s)) { /* added parentheses */ char *s; for (i = 0; (s = pj_units[i].id) && strcmp(name, s); ++i); if (!s) emess(1, "%s unknown unit conversion id", name); fr_meter = 1. / (to_meter = atof(pj_units[i].to_meter)); } else to_meter = fr_meter = 1.; if ((ellipse = es != 0.)) { /* added parentheses */ onef = sqrt(1. - es); geod_f = 1 - onef; f2 = geod_f / 2; f4 = geod_f / 4; f64 = geod_f * geod_f / 64; } else { onef = 1.; geod_f = f2 = f4 = f64 = 0.; } /* * check if line or arc mode */ if (pj_param(start, "tlat_1").i) { double del_S; #undef f phi1 = pj_param(start, "rlat_1").f; lam1 = pj_param(start, "rlon_1").f; if (pj_param(start, "tlat_2").i) { phi2 = pj_param(start, "rlat_2").f; lam2 = pj_param(start, "rlon_2").f; geod_inv(); geod_pre(); } else if ((geod_S = pj_param(start, "dS").f)) { /* added * parentheses */ al12 = pj_param(start, "rA").f; geod_pre(); geod_for(); } else emess(1, "incomplete geodesic/arc info"); if ((n_alpha = pj_param(start, "in_A").i) > 0) { if (!(del_alpha = pj_param(start, "rdel_A").f)) emess(1, "del azimuth == 0"); } else if ((del_S = fabs(pj_param(start, "ddel_S").f))) { /* added * parentheses */ n_S = geod_S / del_S + .5; } else if ((n_S = pj_param(start, "in_S").i) <= 0) emess(1, "no interval divisor selected"); } /* * free up linked list */ for (; start; start = curr) { curr = start->next; pj_dalloc(start); } }
int main(int argc, char **argv) { char *arg, *pargv[MAX_PARGS]; char **eargv = argv; FILE *fid; int pargc = 0, eargc = 0, mon = 0; if ( (emess_dat.Prog_name = strrchr(*argv,DIR_CHAR)) != nullptr) ++emess_dat.Prog_name; else emess_dat.Prog_name = *argv; inverse = ! strncmp(emess_dat.Prog_name, "inv", 3); if (argc <= 1 ) { (void)fprintf(stderr, usage, pj_get_release(), emess_dat.Prog_name); exit (0); } /* process run line arguments */ while (--argc > 0) { /* collect run line arguments */ if(**++argv == '-') for(arg = *argv;;) { switch(*++arg) { case '\0': /* position of "stdin" */ if (arg[-1] == '-') eargv[eargc++] = const_cast<char*>("-"); break; case 'b': /* binary I/O */ bin_in = bin_out = 1; continue; case 'v': /* monitor dump of initialization */ mon = 1; continue; case 'i': /* input binary */ bin_in = 1; continue; case 'o': /* output binary */ bin_out = 1; continue; case 'I': /* alt. method to spec inverse */ inverse = 1; continue; case 'E': /* echo ascii input to ascii output */ echoin = 1; continue; case 'V': /* very verbose processing mode */ very_verby = 1; mon = 1; continue; case 'S': /* compute scale factors */ dofactors = 1; continue; case 't': /* set col. one char */ if (arg[1]) tag = *++arg; else emess(1,"missing -t col. 1 tag"); continue; case 'l': /* list projections, ellipses or units */ if (!arg[1] || arg[1] == 'p' || arg[1] == 'P') { /* list projections */ const struct PJ_LIST *lp; int do_long = arg[1] == 'P', c; const char *str; for (lp = proj_list_operations() ; lp->id ; ++lp) { if( strcmp(lp->id,"latlong") == 0 || strcmp(lp->id,"longlat") == 0 || strcmp(lp->id,"geocent") == 0 ) continue; (void)printf("%s : ", lp->id); if (do_long) /* possibly multiline description */ (void)puts(*lp->descr); else { /* first line, only */ str = *lp->descr; while ((c = *str++) && c != '\n') putchar(c); putchar('\n'); } } } else if (arg[1] == '=') { /* list projection 'descr' */ const struct PJ_LIST *lp; arg += 2; for (lp = proj_list_operations(); lp->id ; ++lp) if (!strcmp(lp->id, arg)) { (void)printf("%9s : %s\n", lp->id, *lp->descr); break; } } else if (arg[1] == 'e') { /* list ellipses */ const struct PJ_ELLPS *le; for (le = proj_list_ellps(); le->id ; ++le) (void)printf("%9s %-16s %-16s %s\n", le->id, le->major, le->ell, le->name); } else if (arg[1] == 'u') { /* list units */ const struct PJ_UNITS *lu; for (lu = proj_list_units(); lu->id ; ++lu) (void)printf("%12s %-20s %s\n", lu->id, lu->to_meter, lu->name); } else if (arg[1] == 'd') { /* list datums */ const struct PJ_DATUMS *ld; printf("__datum_id__ __ellipse___ __definition/comments______________________________\n" ); for (ld = pj_get_datums_ref(); ld->id ; ++ld) { printf("%12s %-12s %-30s\n", ld->id, ld->ellipse_id, ld->defn); if( ld->comments != nullptr && strlen(ld->comments) > 0 ) printf( "%25s %s\n", " ", ld->comments ); } } else emess(1,"invalid list option: l%c",arg[1]); exit(0); /* cppcheck-suppress duplicateBreak */ continue; /* artificial */ case 'e': /* error line alternative */ if (--argc <= 0) noargument: emess(1,"missing argument for -%c",*arg); oterr = *++argv; continue; case 'm': /* cartesian multiplier */ if (--argc <= 0) goto noargument; postscale = 1; if (!strncmp("1/",*++argv,2) || !strncmp("1:",*argv,2)) { if((fscale = atof((*argv)+2)) == 0.) goto badscale; fscale = 1. / fscale; } else if ((fscale = atof(*argv)) == 0.) { badscale: emess(1,"invalid scale argument"); } continue; case 'W': /* specify seconds precision */ case 'w': /* -W for constant field width */ { int c = arg[1]; if (c != 0 && isdigit(c)) { set_rtodms(c - '0', *arg == 'W'); ++arg; } else emess(1,"-W argument missing or non-digit"); continue; } case 'f': /* alternate output format degrees or xy */ if (--argc <= 0) goto noargument; oform = *++argv; continue; case 'd': if (--argc <= 0) goto noargument; sprintf(oform_buffer, "%%.%df", atoi(*++argv)); oform = oform_buffer; break; case 'r': /* reverse input */ reversein = 1; continue; case 's': /* reverse output */ reverseout = 1; continue; default: emess(1, "invalid option: -%c",*arg); break; } break; } else if (**argv == '+') { /* + argument */ if (pargc < MAX_PARGS) pargv[pargc++] = *argv + 1; else emess(1,"overflowed + argument table"); } else /* assumed to be input file name(s) */ eargv[eargc++] = *argv; } if (eargc == 0) /* if no specific files force sysin */ eargv[eargc++] = const_cast<char*>("-"); /* done with parameter and control input */ if (inverse && postscale) { prescale = 1; postscale = 0; fscale = 1./fscale; } if (!(Proj = pj_init(pargc, pargv))) emess(3,"projection initialization failure\ncause: %s", pj_strerrno(pj_errno)); if (!proj_angular_input(Proj, PJ_FWD)) { emess(3, "can't initialize operations that take non-angular input coordinates"); exit(0); } if (proj_angular_output(Proj, PJ_FWD)) { emess(3, "can't initialize operations that produce angular output coordinates"); exit(0); } if (inverse) { if (!Proj->inv) emess(3,"inverse projection not available"); proj.inv = pj_inv; } else proj.fwd = pj_fwd; /* set input formatting control */ if (mon) { pj_pr_list(Proj); if (very_verby) { (void)printf("#Final Earth figure: "); if (Proj->es != 0.0) { (void)printf("ellipsoid\n# Major axis (a): "); (void)printf(oform ? oform : "%.3f", Proj->a); (void)printf("\n# 1/flattening: %.6f\n", 1./(1. - sqrt(1. - Proj->es))); (void)printf("# squared eccentricity: %.12f\n", Proj->es); } else { (void)printf("sphere\n# Radius: "); (void)printf(oform ? oform : "%.3f", Proj->a); (void)putchar('\n'); } } } if (inverse) informat = strtod; else { informat = proj_dmstor; if (!oform) oform = "%.2f"; } if (bin_out) { SET_BINARY_MODE(stdout); } /* process input file list */ for ( ; eargc-- ; ++eargv) { if (**eargv == '-') { fid = stdin; emess_dat.File_name = const_cast<char*>("<stdin>"); if (bin_in) { SET_BINARY_MODE(stdin); } } else { if ((fid = fopen(*eargv, "rb")) == nullptr) { emess(-2, *eargv, "input file"); continue; } emess_dat.File_name = *eargv; } emess_dat.File_line = 0; if (very_verby) vprocess(fid); else process(fid); (void)fclose(fid); emess_dat.File_name = nullptr; } if( Proj ) pj_free(Proj); exit(0); /* normal completion */ }
/* file processing function --- verbosely */ static void vprocess(FILE *fid) { char line[MAX_LINE+3], *s, pline[40]; PJ_LP dat_ll; PJ_XY dat_xy; int linvers; PJ_COORD coord; if (!oform) oform = "%.3f"; if (bin_in || bin_out) emess(1,"binary I/O not available in -V option"); for (;;) { proj_errno_reset(Proj); ++emess_dat.File_line; if (!(s = fgets(line, MAX_LINE, fid))) break; if (!strchr(s, '\n')) { /* overlong line */ int c; (void)strcat(s, "\n"); /* gobble up to newline */ while ((c = fgetc(fid)) != EOF && c != '\n') ; } if (*s == tag) { /* pass on data */ (void)fputs(s, stdout); continue; } /* check to override default input mode */ if (*s == 'I' || *s == 'i') { linvers = 1; ++s; } else linvers = inverse; if (linvers) { if (!PJ_INVERS(Proj)) { emess(-1,"inverse for this projection not avail.\n"); continue; } dat_xy.x = strtod(s, &s); dat_xy.y = strtod(s, &s); if (dat_xy.x == HUGE_VAL || dat_xy.y == HUGE_VAL) { emess(-1,"lon-lat input conversion failure\n"); continue; } if (prescale) { dat_xy.x *= fscale; dat_xy.y *= fscale; } if (reversein) { PJ_XY temp = dat_xy; dat_xy.x = temp.y; dat_xy.y = temp.x; } dat_ll = pj_inv(dat_xy, Proj); } else { dat_ll.lam = proj_dmstor(s, &s); dat_ll.phi = proj_dmstor(s, &s); if (dat_ll.lam == HUGE_VAL || dat_ll.phi == HUGE_VAL) { emess(-1,"lon-lat input conversion failure\n"); continue; } if (reversein) { PJ_LP temp = dat_ll; dat_ll.lam = temp.phi; dat_ll.phi = temp.lam; } dat_xy = pj_fwd(dat_ll, Proj); if (postscale) { dat_xy.x *= fscale; dat_xy.y *= fscale; } } /* For some reason pj_errno does not work as expected in some */ /* versions of Visual Studio, so using pj_get_errno_ref instead */ if (*pj_get_errno_ref()) { emess(-1, pj_strerrno(*pj_get_errno_ref())); continue; } if (!*s && (s > line)) --s; /* assumed we gobbled \n */ coord.lp = dat_ll; facs = proj_factors(Proj, coord); if (proj_errno(Proj)) { emess(-1,"failed to compute factors\n\n"); continue; } if (*s != '\n') (void)fputs(s, stdout); (void)fputs("Longitude: ", stdout); (void)fputs(proj_rtodms(pline, dat_ll.lam, 'E', 'W'), stdout); (void)printf(" [ %.11g ]\n", dat_ll.lam * RAD_TO_DEG); (void)fputs("Latitude: ", stdout); (void)fputs(proj_rtodms(pline, dat_ll.phi, 'N', 'S'), stdout); (void)printf(" [ %.11g ]\n", dat_ll.phi * RAD_TO_DEG); (void)fputs("Easting (x): ", stdout); (void)printf(oform, dat_xy.x); putchar('\n'); (void)fputs("Northing (y): ", stdout); (void)printf(oform, dat_xy.y); putchar('\n'); (void)printf("Meridian scale (h) : %.8f ( %.4g %% error )\n", facs.meridional_scale, (facs.meridional_scale-1.)*100.); (void)printf("Parallel scale (k) : %.8f ( %.4g %% error )\n", facs.parallel_scale, (facs.parallel_scale-1.)*100.); (void)printf("Areal scale (s): %.8f ( %.4g %% error )\n", facs.areal_scale, (facs.areal_scale-1.)*100.); (void)printf("Angular distortion (w): %.3f\n", facs.angular_distortion * RAD_TO_DEG); (void)printf("Meridian/Parallel angle: %.5f\n", facs.meridian_parallel_angle * RAD_TO_DEG); (void)printf("Convergence : "); (void)fputs(proj_rtodms(pline, facs.meridian_convergence, 0, 0), stdout); (void)printf(" [ %.8f ]\n", facs.meridian_convergence * RAD_TO_DEG); (void)printf("Max-min (Tissot axis a-b) scale error: %.5f %.5f\n\n", facs.tissot_semimajor, facs.tissot_semiminor); } }
GEODESIC_T * GEOD_init(int argc, char **argv, GEODESIC_T *GEODESIC) { paralist *start = 0, *curr = 0; double es; char *name; int i; if(0 == GEODESIC) { GEODESIC = malloc(sizeof(GEODESIC_T)); } memset(GEODESIC, 0, sizeof(GEODESIC_T)); /* put arguments into internal linked list */ if (argc <= 0) emess(1, "no arguments in initialization list"); for (i = 0; i < argc; ++i) if (i) curr = curr->next = pj_mkparam(argv[i]); else start = curr = pj_mkparam(argv[i]); /* set elliptical parameters */ if (pj_ell_set(start, &GEODESIC->A, &es)) emess(1,"ellipse setup failure"); /* set units */ if ((name = pj_param(start, "sunits").s)) { char *s; struct PJ_UNITS *unit_list = pj_get_units_ref(); for (i = 0; (s = unit_list[i].id) && strcmp(name, s) ; ++i) ; if (!s) emess(1,"%s unknown unit conversion id", name); GEODESIC->FR_METER = 1. / (GEODESIC->TO_METER = atof(unit_list[i].to_meter)); } else GEODESIC->TO_METER = GEODESIC->FR_METER = 1.; if ((GEODESIC->ELLIPSE = (es != 0.))) { GEODESIC->ONEF = sqrt(1. - es); GEODESIC->FLAT = 1 - GEODESIC->ONEF; GEODESIC->FLAT2 = GEODESIC->FLAT/2; GEODESIC->FLAT4 = GEODESIC->FLAT/4; GEODESIC->FLAT64 = GEODESIC->FLAT*GEODESIC->FLAT/64; } else { GEODESIC->ONEF = 1.; GEODESIC->FLAT = GEODESIC->FLAT2 = GEODESIC->FLAT4 = GEODESIC->FLAT64 = 0.; } /* check if line or arc mode */ if (pj_param(start, "tlat_1").i) { double del_S; #undef f GEODESIC->p1.u = pj_param(start, "rlat_1").f; GEODESIC->p1.v = pj_param(start, "rlon_1").f; if (pj_param(start, "tlat_2").i) { GEODESIC->p2.u = pj_param(start, "rlat_2").f; GEODESIC->p2.v = pj_param(start, "rlon_2").f; geod_inv(GEODESIC); geod_pre(GEODESIC); } else if ((GEODESIC->DIST = pj_param(start, "dS").f)) { GEODESIC->ALPHA12 = pj_param(start, "rA").f; geod_pre(GEODESIC); geod_for(GEODESIC); } else emess(1,"incomplete geodesic/arc info"); if ((GEODESIC->n_alpha = pj_param(start, "in_A").i) > 0) { if (!(GEODESIC->del_alpha = pj_param(start, "rdel_A").f)) emess(1,"del azimuth == 0"); } else if ((del_S = fabs(pj_param(start, "ddel_S").f))) { GEODESIC->n_S = GEODESIC->DIST / del_S + .5; } else if ((GEODESIC->n_S = pj_param(start, "in_S").i) <= 0) emess(1,"no interval divisor selected"); } /* free up linked list */ for ( ; start; start = curr) { curr = start->next; pj_dalloc(start); } return GEODESIC; }
void main(int argc, char **argv) { char *arg, **eargv = argv, *strnchr(); FILE *fid; static int eargc = 0, c; if (emess_dat.Prog_name = strrchr(*argv,'/')) ++emess_dat.Prog_name; else emess_dat.Prog_name = *argv; inverse = ! strncmp(emess_dat.Prog_name, "inv", 3); /* process run line arguments */ while (--argc > 0) { /* collect run line arguments */ if(**++argv == '-') for(arg = *argv;;) { switch(*++arg) { case '\0': /* position of "stdin" */ if (arg[-1] == '-') eargv[eargc++] = "-"; break; case 'a': /* output full set of values */ fullout = 1; continue; case 'I': /* alt. inverse spec. */ inverse = 1; continue; case 't': /* set col. one char */ if (arg[1]) tag = *++arg; else emess(1,"missing -t col. 1 tag"); continue; case 'W': /* specify seconds precision */ case 'w': /* -W for constant field width */ if ((c = arg[1]) && isdigit(c)) { set_rtodms(c - '0', *arg == 'W'); ++arg; } else emess(1,"-W argument missing or non-digit"); continue; case 'f': /* alternate output format degrees or xy */ if (--argc <= 0) noargument: emess(1,"missing argument for -%c",*arg); oform = *++argv; continue; case 'F': /* alternate output format degrees or xy */ if (--argc <= 0) goto noargument; osform = *++argv; continue; case 'l': if (!arg[1] || arg[1] == 'e') { /* list of ellipsoids */ struct PJ_ELLPS *le; for (le = pj_ellps; le->id ; ++le) (void)printf("%9s %-16s %-16s %s\n", le->id, le->major, le->ell, le->name); emess(1,"invalid list option: l%c",arg[1]); emess(1,"-l[p|e] terminates program"); } else if (arg[1] == 'u') { /* list of units */ struct PJ_UNITS *lu; for (lu = pj_units; lu->id ; ++lu) (void)printf("%12s %-20s %s\n", lu->id, lu->to_meter, lu->name); } else emess(1,"invalid list option: l%c",arg[1]); emess(1,"will not proceed after display list option"); case 'p': /* output azimuths as positive */ pos_azi = 1; continue; default: emess(1, "invalid option: -%c",*arg); break; } break; } else if (**argv == '+') /* + argument */ if (pargc < MAX_PARGS) pargv[pargc++] = *argv + 1; else emess(1,"overflowed + argument table"); else /* assumed to be input file name(s) */ eargv[eargc++] = *argv; } /* done with parameter and control input */ geod_setup(pargc, pargv); /* setup projection */ if ((n_alpha || n_S) && eargc) emess(1,"files specified for arc/geodesic mode"); if (n_alpha) do_arc(); else if (n_S) do_geod(); else { /* process input file list */ if (eargc == 0) /* if no specific files force sysin */ eargv[eargc++] = "-"; for ( ; eargc-- ; ++eargv) { if (**eargv == '-') { fid = stdin; emess_dat.File_name = "<stdin>"; } else { if ((fid = fopen(*eargv, "r")) == NULL) { emess(-2, *eargv, "input file"); continue; } emess_dat.File_name = *eargv; } emess_dat.File_line = 0; process(fid); (void)fclose(fid); emess_dat.File_name = (char *)0; } } exit(0); /* normal completion */ }