/** * Sets default values to the properties when there is no user setting. */ void setDefault(g2sprop * prop) { char *pargv[2]; int pargc = 2; char *ellps; /* if there are no options like -p,-w,-e, sets as -a */ if (!(prop->parseWpt | prop->parseTrk | prop->parseRte)) { prop->parseWpt = 1; prop->parseTrk = 1; prop->parseRte = 1; } /* if there is no output setting, sets it as [sourcefile name] - ".gpx" */ if (prop->output == NULL) { char *dot = strrchr(prop->sourcefile, '.'); prop->output = (char *) malloc(sizeof(char) * strlen(prop->sourcefile) + 1); if (0 == strcmp(dot, ".gpx")) { int len = dot - prop->sourcefile; strncpy(prop->output, prop->sourcefile, len); prop->output[len] = 0; } else { fprintf(stderr, "The source file doesn't have .gpx extension.\n"); exit(ERR_ISNOTGPX); } } /* sets ellipsoid "WGS84" */ if (prop->ellipsoid == NULL) { prop->ellipsoid = (char *) malloc(sizeof(char) * 7); strcpy(prop->ellipsoid, "WGS84"); } /* sets lengthUnit "m" */ if (prop->lengthUnit == NULL) { prop->lengthUnit = (char *) malloc(sizeof(char) * 2); strcpy(prop->lengthUnit, "m"); } /* sets timeUnit "sec" */ if (prop->timeUnit == NULL) { prop->timeUnit = (char *) malloc(sizeof(char) * 4); strcpy(prop->timeUnit, "sec"); } /* sets speedLengthUnit "km" */ if (prop->speedLengthUnit == NULL) { prop->speedLengthUnit = (char *) malloc(sizeof(char) * 3); strcpy(prop->speedLengthUnit, "km"); } /* sets speedTimeUnit "hour" */ if (prop->speedTimeUnit == NULL) { prop->speedTimeUnit = (char *) malloc(sizeof(char) * 5); strcpy(prop->speedTimeUnit, "hour"); } /* sets ellipsoid setting to geod* programs */ ellps = malloc(sizeof(char) * (strlen(prop->ellipsoid) + 8)); strcpy(ellps, "+ellps="); strcat(ellps, prop->ellipsoid); pargv[0] = ellps; pargv[1] = prop->lengthUnit; checkEllpsUnit(prop->ellipsoid); prop->length2meter = checkLengthUnit(prop->lengthUnit); prop->time2sec = checkTimeUnit(prop->timeUnit); prop->speed2meter = checkLengthUnit(prop->speedLengthUnit); prop->speed2sec = checkTimeUnit(prop->speedTimeUnit); geod_set(pargc, pargv); if (prop->verbose) { printf("source filename:\t%s\n", prop->sourcefile); printf("output file base name:\t%s\n", prop->output); } free(ellps); }
int main(int argc, char **argv) { char *arg, **eargv = argv, *strnchr(); FILE *fid; static int eargc = 0, c; if ((emess_dat.Prog_name = strrchr(*argv,'/')) != NULL) ++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 '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_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 of 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 emess(1,"invalid list option: l%c",arg[1]); exit( 0 ); 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_set(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 */ }