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); } }
PJ * pj_init(int argc, char **argv) { char *s, *name; paralist *start = NULL; PJ *(*proj)(PJ *); paralist *curr; int i; PJ *PIN = 0; const char *old_locale; errno = pj_errno = 0; start = NULL; old_locale = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC,"C"); /* put arguments into internal linked list */ if (argc <= 0) { pj_errno = -1; goto bum_call; } for (i = 0; i < argc; ++i) if (i) curr = curr->next = pj_mkparam(argv[i]); else start = curr = pj_mkparam(argv[i]); if (pj_errno) goto bum_call; /* check if +init present */ if (pj_param(start, "tinit").i) { paralist *last = curr; if (!(curr = get_init(&start, curr, pj_param(start, "sinit").s))) goto bum_call; if (curr == last) { pj_errno = -2; goto bum_call; } } /* find projection selection */ if (!(name = pj_param(start, "sproj").s)) { pj_errno = -4; goto bum_call; } for (i = 0; (s = pj_list[i].id) && strcmp(name, s) ; ++i) ; if (!s) { pj_errno = -5; goto bum_call; } /* set defaults, unless inhibited */ if (!pj_param(start, "bno_defs").i) curr = get_defaults(&start, curr, name); proj = (PJ *(*)(PJ *)) pj_list[i].proj; /* allocate projection structure */ if (!(PIN = (*proj)(0))) goto bum_call; PIN->params = start; PIN->is_latlong = 0; PIN->is_geocent = 0; PIN->long_wrap_center = 0.0; /* set datum parameters */ if (pj_datum_set(start, PIN)) goto bum_call; /* set ellipsoid/sphere parameters */ if (pj_ell_set(start, &PIN->a, &PIN->es)) goto bum_call; PIN->a_orig = PIN->a; PIN->es_orig = PIN->es; PIN->e = sqrt(PIN->es); PIN->ra = 1. / PIN->a; PIN->one_es = 1. - PIN->es; if (PIN->one_es == 0.) { pj_errno = -6; goto bum_call; } PIN->rone_es = 1./PIN->one_es; /* Now that we have ellipse information check for WGS84 datum */ if( PIN->datum_type == PJD_3PARAM && PIN->datum_params[0] == 0.0 && PIN->datum_params[1] == 0.0 && PIN->datum_params[2] == 0.0 && PIN->a == 6378137.0 && ABS(PIN->es - 0.006694379990) < 0.000000000050 )/*WGS84/GRS80*/ { PIN->datum_type = PJD_WGS84; } /* set PIN->geoc coordinate system */ PIN->geoc = (PIN->es && pj_param(start, "bgeoc").i); /* over-ranging flag */ PIN->over = pj_param(start, "bover").i; /* longitude center for wrapping */ PIN->long_wrap_center = pj_param(start, "rlon_wrap").f; /* central meridian */ PIN->lam0=pj_param(start, "rlon_0").f; /* central latitude */ PIN->phi0 = pj_param(start, "rlat_0").f; /* false easting and northing */ PIN->x0 = pj_param(start, "dx_0").f; PIN->y0 = pj_param(start, "dy_0").f; /* general scaling factor */ if (pj_param(start, "tk_0").i) PIN->k0 = pj_param(start, "dk_0").f; else if (pj_param(start, "tk").i) PIN->k0 = pj_param(start, "dk").f; else PIN->k0 = 1.; if (PIN->k0 <= 0.) { pj_errno = -31; goto bum_call; } /* set units */ s = 0; if ((name = pj_param(start, "sunits").s)) { for (i = 0; (s = pj_units[i].id) && strcmp(name, s) ; ++i) ; if (!s) { pj_errno = -7; goto bum_call; } s = pj_units[i].to_meter; } if (s || (s = pj_param(start, "sto_meter").s)) { PIN->to_meter = strtod(s, &s); if (*s == '/') /* ratio number */ PIN->to_meter /= strtod(++s, 0); PIN->fr_meter = 1. / PIN->to_meter; } else PIN->to_meter = PIN->fr_meter = 1.; /* prime meridian */ s = 0; if ((name = pj_param(start, "spm").s)) { const char *value = NULL; char *next_str = NULL; for (i = 0; pj_prime_meridians[i].id != NULL; ++i ) { if( strcmp(name,pj_prime_meridians[i].id) == 0 ) { value = pj_prime_meridians[i].defn; break; } } if( value == NULL && (dmstor(name,&next_str) != 0.0 || *name == '0') && *next_str == '\0' ) value = name; if (!value) { pj_errno = -46; goto bum_call; } PIN->from_greenwich = dmstor(value,NULL); } else PIN->from_greenwich = 0.0; /* projection specific initialization */ if (!(PIN = (*proj)(PIN)) || errno || pj_errno) { bum_call: /* cleanup error return */ if (!pj_errno) pj_errno = errno; if (PIN) pj_free(PIN); else for ( ; start; start = curr) { curr = start->next; pj_dalloc(start); } PIN = 0; } setlocale(LC_NUMERIC,old_locale); return PIN; }
parameters pj_init(R const& arguments, bool use_defaults = true) { parameters pin; for (std::vector<std::string>::const_iterator it = boost::begin(arguments); it != boost::end(arguments); it++) { pin.params.push_back(pj_mkparam(*it)); } /* check if +init present */ if (pj_param(pin.params, "tinit").i) { // maybe TODO: handle "init" parameter //if (!(curr = get_init(&arguments, curr, pj_param(pin.params, "sinit").s))) } // find projection -> implemented in projection factory pin.name = pj_param(pin.params, "sproj").s; //if (pin.name.empty()) //{ throw proj_exception(-4); } // set defaults, unless inhibited // GL-Addition, if use_defaults is false then defaults are ignored if (use_defaults && ! pj_param(pin.params, "bno_defs").i) { // proj4 gets defaults from "proj_def.dat", file of 94/02/23 with a few defaults. // Here manually if (pin.name == "lcc") { pin.params.push_back(pj_mkparam("lat_1=33")); pin.params.push_back(pj_mkparam("lat_2=45")); } else if (pin.name == "aea") { pin.params.push_back(pj_mkparam("lat_1=29.5")); pin.params.push_back(pj_mkparam("lat_2=45.5 ")); } else { //<general>ellps=WGS84 } //curr = get_defaults(&arguments, curr, name); } /* allocate projection structure */ // done by constructor: // pin.is_latlong = 0; // pin.is_geocent = 0; // pin.long_wrap_center = 0.0; /* set datum parameters */ pj_datum_set(pin.params, pin); /* set ellipsoid/sphere parameters */ pj_ell_set(pin.params, pin.a, pin.es); pin.a_orig = pin.a; pin.es_orig = pin.es; pin.e = sqrt(pin.es); pin.ra = 1. / pin.a; pin.one_es = 1. - pin.es; if (pin.one_es == 0.) { throw proj_exception(-6); } pin.rone_es = 1./pin.one_es; /* Now that we have ellipse information check for WGS84 datum */ if( pin.datum_type == PJD_3PARAM && pin.datum_params[0] == 0.0 && pin.datum_params[1] == 0.0 && pin.datum_params[2] == 0.0 && pin.a == 6378137.0 && geometry::math::abs(pin.es - 0.006694379990) < 0.000000000050 )/*WGS84/GRS80*/ { pin.datum_type = PJD_WGS84; } /* set pin.geoc coordinate system */ pin.geoc = (pin.es && pj_param(pin.params, "bgeoc").i); /* over-ranging flag */ pin.over = pj_param(pin.params, "bover").i; /* longitude center for wrapping */ pin.long_wrap_center = pj_param(pin.params, "rlon_wrap").f; /* central meridian */ pin.lam0 = pj_param(pin.params, "rlon_0").f; /* central latitude */ pin.phi0 = pj_param(pin.params, "rlat_0").f; /* false easting and northing */ pin.x0 = pj_param(pin.params, "dx_0").f; pin.y0 = pj_param(pin.params, "dy_0").f; /* general scaling factor */ if (pj_param(pin.params, "tk_0").i) pin.k0 = pj_param(pin.params, "dk_0").f; else if (pj_param(pin.params, "tk").i) pin.k0 = pj_param(pin.params, "dk").f; else pin.k0 = 1.; if (pin.k0 <= 0.) { throw proj_exception(-31); } /* set units */ std::string s; std::string units = pj_param(pin.params, "sunits").s; if (! units.empty()) { const int n = sizeof(pj_units) / sizeof(pj_units[0]); int index = -1; for (int i = 0; i < n && index == -1; i++) { if(pj_units[i].id == units) { index = i; } } if (index == -1) { throw proj_exception(-7); } s = pj_units[index].to_meter; } if (s.empty()) { s = pj_param(pin.params, "sto_meter").s; } if (! s.empty()) { // TODO: IMPLEMENT SPLIT pin.to_meter = atof(s.c_str()); //if (*s == '/') /* ratio number */ // pin.to_meter /= strtod(++s, 0); pin.fr_meter = 1. / pin.to_meter; } else { pin.to_meter = pin.fr_meter = 1.; } /* prime meridian */ s.clear(); std::string pm = pj_param(pin.params, "spm").s; if (! pm.empty()) { std::string value; int n = sizeof(pj_prime_meridians) / sizeof(pj_prime_meridians[0]); int index = -1; for (int i = 0; i < n && index == -1; i++) { if(pj_prime_meridians[i].id == pm) { value = pj_prime_meridians[i].defn; index = i; } } if (index == -1) { throw proj_exception(-7); } if (value.empty()) { throw proj_exception(-46); } geometry::strategy::dms_parser<true> parser; pin.from_greenwich = parser(value.c_str()); } else { pin.from_greenwich = 0.0; } return pin; }
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); } }
PJ * pj_init_ctx(projCtx ctx, int argc, char **argv) { char *s, *name; paralist *start = NULL; PJ *(*proj)(PJ *); paralist *curr; int i; PJ *PIN = 0; char *old_locale; ctx->last_errno = 0; start = NULL; old_locale = strdup(setlocale(LC_NUMERIC, NULL)); if( strcmp(old_locale,"C") != 0 ) setlocale(LC_NUMERIC,"C"); /* put arguments into internal linked list */ if (argc <= 0) { pj_ctx_set_errno( ctx, -1 ); goto bum_call; } for (i = 0; i < argc; ++i) if (i) curr = curr->next = pj_mkparam(argv[i]); else start = curr = pj_mkparam(argv[i]); if (ctx->last_errno) goto bum_call; /* check if +init present */ if (pj_param(ctx, start, "tinit").i) { paralist *last = curr; if (!(curr = get_init(ctx,&start, curr, pj_param(ctx, start, "sinit").s))) goto bum_call; if (curr == last) { pj_ctx_set_errno( ctx, -2); goto bum_call; } } /* find projection selection */ if (!(name = pj_param(ctx, start, "sproj").s)) { pj_ctx_set_errno( ctx, -4 ); goto bum_call; } for (i = 0; (s = pj_list[i].id) && strcmp(name, s) ; ++i) ; if (!s) { pj_ctx_set_errno( ctx, -5 ); goto bum_call; } /* set defaults, unless inhibited */ if (!pj_param(ctx, start, "bno_defs").i) curr = get_defaults(ctx,&start, curr, name); proj = (PJ *(*)(PJ *)) pj_list[i].proj; /* allocate projection structure */ if (!(PIN = (*proj)(0))) goto bum_call; PIN->ctx = ctx; PIN->params = start; PIN->is_latlong = 0; PIN->is_geocent = 0; PIN->is_long_wrap_set = 0; PIN->long_wrap_center = 0.0; strcpy( PIN->axis, "enu" ); PIN->gridlist = NULL; PIN->gridlist_count = 0; PIN->vgridlist_geoid = NULL; PIN->vgridlist_geoid_count = 0; /* set datum parameters */ if (pj_datum_set(ctx, start, PIN)) goto bum_call; /* set ellipsoid/sphere parameters */ if (pj_ell_set(ctx, start, &PIN->a, &PIN->es)) goto bum_call; PIN->a_orig = PIN->a; PIN->es_orig = PIN->es; PIN->e = sqrt(PIN->es); PIN->ra = 1. / PIN->a; PIN->one_es = 1. - PIN->es; if (PIN->one_es == 0.) { pj_ctx_set_errno( ctx, -6 ); goto bum_call; } PIN->rone_es = 1./PIN->one_es; /* Now that we have ellipse information check for WGS84 datum */ if( PIN->datum_type == PJD_3PARAM && PIN->datum_params[0] == 0.0 && PIN->datum_params[1] == 0.0 && PIN->datum_params[2] == 0.0 && PIN->a == 6378137.0 && ABS(PIN->es - 0.006694379990) < 0.000000000050 )/*WGS84/GRS80*/ { PIN->datum_type = PJD_WGS84; } /* set PIN->geoc coordinate system */ PIN->geoc = (PIN->es && pj_param(ctx, start, "bgeoc").i); /* over-ranging flag */ PIN->over = pj_param(ctx, start, "bover").i; /* vertical datum geoid grids */ PIN->has_geoid_vgrids = pj_param(ctx, start, "tgeoidgrids").i; if( PIN->has_geoid_vgrids ) /* we need to mark it as used. */ pj_param(ctx, start, "sgeoidgrids"); /* longitude center for wrapping */ PIN->is_long_wrap_set = pj_param(ctx, start, "tlon_wrap").i; if (PIN->is_long_wrap_set) PIN->long_wrap_center = pj_param(ctx, start, "rlon_wrap").f; /* axis orientation */ if( (pj_param(ctx, start,"saxis").s) != NULL ) { static const char *axis_legal = "ewnsud"; const char *axis_arg = pj_param(ctx, start,"saxis").s; if( strlen(axis_arg) != 3 ) { pj_ctx_set_errno( ctx, PJD_ERR_AXIS ); goto bum_call; } if( strchr( axis_legal, axis_arg[0] ) == NULL || strchr( axis_legal, axis_arg[1] ) == NULL || strchr( axis_legal, axis_arg[2] ) == NULL) { pj_ctx_set_errno( ctx, PJD_ERR_AXIS ); goto bum_call; } /* it would be nice to validate we don't have on axis repeated */ strcpy( PIN->axis, axis_arg ); } PIN->is_long_wrap_set = pj_param(ctx, start, "tlon_wrap").i; if (PIN->is_long_wrap_set) PIN->long_wrap_center = pj_param(ctx, start, "rlon_wrap").f; /* central meridian */ PIN->lam0=pj_param(ctx, start, "rlon_0").f; /* central latitude */ PIN->phi0 = pj_param(ctx, start, "rlat_0").f; /* false easting and northing */ PIN->x0 = pj_param(ctx, start, "dx_0").f; PIN->y0 = pj_param(ctx, start, "dy_0").f; /* general scaling factor */ if (pj_param(ctx, start, "tk_0").i) PIN->k0 = pj_param(ctx, start, "dk_0").f; else if (pj_param(ctx, start, "tk").i) PIN->k0 = pj_param(ctx, start, "dk").f; else PIN->k0 = 1.; if (PIN->k0 <= 0.) { pj_ctx_set_errno( ctx, -31 ); goto bum_call; } /* set units */ s = 0; if ((name = pj_param(ctx, start, "sunits").s) != NULL) { for (i = 0; (s = pj_units[i].id) && strcmp(name, s) ; ++i) ; if (!s) { pj_ctx_set_errno( ctx, -7 ); goto bum_call; } s = pj_units[i].to_meter; } if (s || (s = pj_param(ctx, start, "sto_meter").s)) { PIN->to_meter = strtod(s, &s); if (*s == '/') /* ratio number */ PIN->to_meter /= strtod(++s, 0); PIN->fr_meter = 1. / PIN->to_meter; } else PIN->to_meter = PIN->fr_meter = 1.; /* set vertical units */ s = 0; if ((name = pj_param(ctx, start, "svunits").s) != NULL) { for (i = 0; (s = pj_units[i].id) && strcmp(name, s) ; ++i) ; if (!s) { pj_ctx_set_errno( ctx, -7 ); goto bum_call; } s = pj_units[i].to_meter; } if (s || (s = pj_param(ctx, start, "svto_meter").s)) { PIN->vto_meter = strtod(s, &s); if (*s == '/') /* ratio number */ PIN->vto_meter /= strtod(++s, 0); PIN->vfr_meter = 1. / PIN->vto_meter; } else { PIN->vto_meter = PIN->to_meter; PIN->vfr_meter = PIN->fr_meter; } /* prime meridian */ s = 0; if ((name = pj_param(ctx, start, "spm").s) != NULL) { const char *value = NULL; char *next_str = NULL; for (i = 0; pj_prime_meridians[i].id != NULL; ++i ) { if( strcmp(name,pj_prime_meridians[i].id) == 0 ) { value = pj_prime_meridians[i].defn; break; } } if( value == NULL && (dmstor_ctx(ctx,name,&next_str) != 0.0 || *name == '0') && *next_str == '\0' ) value = name; if (!value) { pj_ctx_set_errno( ctx, -46 ); goto bum_call; } PIN->from_greenwich = dmstor_ctx(ctx,value,NULL); } else PIN->from_greenwich = 0.0; /* projection specific initialization */ if (!(PIN = (*proj)(PIN)) || ctx->last_errno) { bum_call: /* cleanup error return */ if (PIN) pj_free(PIN); else for ( ; start; start = curr) { curr = start->next; pj_dalloc(start); } PIN = 0; } if( strcmp(old_locale,"C") != 0 ) setlocale(LC_NUMERIC,old_locale); free( (char*)old_locale ); return PIN; }
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; }