diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/PJ_aea.c | 271 | ||||
| -rw-r--r-- | src/pj_list.c | 49 | ||||
| -rw-r--r-- | src/pj_run_selftests.c | 62 | ||||
| -rw-r--r-- | src/projects.h | 26 |
4 files changed, 224 insertions, 184 deletions
diff --git a/src/PJ_aea.c b/src/PJ_aea.c index e1aa7109..59f3e7bd 100644 --- a/src/PJ_aea.c +++ b/src/PJ_aea.c @@ -211,13 +211,13 @@ PJ *PROJECTION(leac) { P->descr = des_leac; Q->phi2 = pj_param(P->ctx, P->params, "rlat_1").f; Q->phi1 = pj_param(P->ctx, P->params, "bsouth").i ? - HALFPI: HALFPI; - setup(P); + setup (P); return P; } #ifdef PJ_OMIT_SELFTEST -int pj_aea_selftest (void) {return 0;} +int pj_aea_selftest (void) {return 10000;} #else int pj_aea_selftest (void) { @@ -277,7 +277,7 @@ int pj_aea_selftest (void) { #ifdef PJ_OMIT_SELFTEST -int pj_leac_selftest (void) {return 0;} +int pj_leac_selftest (void) {return 10000;} #else int pj_leac_selftest (void) { @@ -346,136 +346,143 @@ int pj_leac_selftest (void) { SELFTEST STUBS ************************************************************************ -Preliminary selftest stubs temporarily placed here, and removed as real -selftest functions are added to the projection source files - -***********************************************************************/ +Selftest stubs temporarily placed here. -int pj_aeqd_selftest (void) {return 0;} -int pj_alsk_selftest (void) {return 0;} - -int pj_calcofi_selftest (void) {return 0;} -int pj_cass_selftest (void) {return 0;} -int pj_cc_selftest (void) {return 0;} -int pj_cea_selftest (void) {return 0;} -int pj_chamb_selftest (void) {return 0;} -int pj_collg_selftest (void) {return 0;} -int pj_crast_selftest (void) {return 0;} -int pj_denoy_selftest (void) {return 0;} -int pj_eck1_selftest (void) {return 0;} -int pj_eck2_selftest (void) {return 0;} -int pj_eck3_selftest (void) {return 0;} -int pj_eck4_selftest (void) {return 0;} -int pj_eck5_selftest (void) {return 0;} -int pj_eck6_selftest (void) {return 0;} -int pj_eqc_selftest (void) {return 0;} -int pj_eqdc_selftest (void) {return 0;} -int pj_euler_selftest (void) {return 0;} -int pj_etmerc_selftest (void) {return 0;} -int pj_fahey_selftest (void) {return 0;} -int pj_fouc_selftest (void) {return 0;} -int pj_fouc_s_selftest (void) {return 0;} -int pj_gall_selftest (void) {return 0;} -int pj_geos_selftest (void) {return 0;} -int pj_gins8_selftest (void) {return 0;} -int pj_gn_sinu_selftest (void) {return 0;} -int pj_gnom_selftest (void) {return 0;} -int pj_goode_selftest (void) {return 0;} -int pj_gs48_selftest (void) {return 0;} -int pj_gs50_selftest (void) {return 0;} -int pj_hammer_selftest (void) {return 0;} -int pj_hatano_selftest (void) {return 0;} -int pj_healpix_selftest (void) {return 0;} -int pj_rhealpix_selftest (void) {return 0;} -int pj_igh_selftest (void) {return 0;} -int pj_imw_p_selftest (void) {return 0;} -int pj_isea_selftest (void) {return 0;} -int pj_kav5_selftest (void) {return 0;} -int pj_kav7_selftest (void) {return 0;} -int pj_krovak_selftest (void) {return 0;} -int pj_labrd_selftest (void) {return 0;} -int pj_laea_selftest (void) {return 0;} -int pj_lagrng_selftest (void) {return 0;} -int pj_larr_selftest (void) {return 0;} -int pj_lask_selftest (void) {return 0;} -int pj_lonlat_selftest (void) {return 0;} -int pj_latlon_selftest (void) {return 0;} -int pj_lcc_selftest (void) {return 0;} -int pj_lcca_selftest (void) {return 0;} - -int pj_lee_os_selftest (void) {return 0;} -int pj_loxim_selftest (void) {return 0;} -int pj_lsat_selftest (void) {return 0;} -int pj_mbt_s_selftest (void) {return 0;} -int pj_mbt_fps_selftest (void) {return 0;} -int pj_mbtfpp_selftest (void) {return 0;} -int pj_mbtfpq_selftest (void) {return 0;} -int pj_mbtfps_selftest (void) {return 0;} -int pj_merc_selftest (void) {return 0;} -int pj_mil_os_selftest (void) {return 0;} -int pj_mill_selftest (void) {return 0;} -int pj_moll_selftest (void) {return 0;} -int pj_murd1_selftest (void) {return 0;} -int pj_murd2_selftest (void) {return 0;} -int pj_murd3_selftest (void) {return 0;} -int pj_natearth_selftest (void) {return 0;} -int pj_nell_selftest (void) {return 0;} -int pj_nell_h_selftest (void) {return 0;} -int pj_nicol_selftest (void) {return 0;} -int pj_nsper_selftest (void) {return 0;} -int pj_nzmg_selftest (void) {return 0;} -int pj_ob_tran_selftest (void) {return 0;} -int pj_ocea_selftest (void) {return 0;} -int pj_oea_selftest (void) {return 0;} -int pj_omerc_selftest (void) {return 0;} -int pj_ortho_selftest (void) {return 0;} -int pj_pconic_selftest (void) {return 0;} -int pj_poly_selftest (void) {return 0;} -int pj_putp1_selftest (void) {return 0;} -int pj_putp2_selftest (void) {return 0;} -int pj_putp3_selftest (void) {return 0;} -int pj_putp3p_selftest (void) {return 0;} -int pj_putp4p_selftest (void) {return 0;} -int pj_putp5_selftest (void) {return 0;} -int pj_putp5p_selftest (void) {return 0;} -int pj_putp6_selftest (void) {return 0;} -int pj_putp6p_selftest (void) {return 0;} -int pj_qua_aut_selftest (void) {return 0;} -int pj_qsc_selftest (void) {return 0;} -int pj_robin_selftest (void) {return 0;} -int pj_rouss_selftest (void) {return 0;} -int pj_rpoly_selftest (void) {return 0;} -int pj_sch_selftest (void) {return 0;} -int pj_sinu_selftest (void) {return 0;} -int pj_somerc_selftest (void) {return 0;} -int pj_stere_selftest (void) {return 0;} -int pj_sterea_selftest (void) {return 0;} -int pj_gstmerc_selftest (void) {return 0;} -int pj_tcc_selftest (void) {return 0;} -int pj_tcea_selftest (void) {return 0;} -int pj_tissot_selftest (void) {return 0;} -int pj_tmerc_selftest (void) {return 0;} -int pj_tpeqd_selftest (void) {return 0;} -int pj_tpers_selftest (void) {return 0;} -int pj_ups_selftest (void) {return 0;} -int pj_urm5_selftest (void) {return 0;} -int pj_urmfps_selftest (void) {return 0;} -int pj_utm_selftest (void) {return 0;} -int pj_vandg_selftest (void) {return 0;} -int pj_vandg2_selftest (void) {return 0;} -int pj_vandg3_selftest (void) {return 0;} -int pj_vandg4_selftest (void) {return 0;} -int pj_vitk1_selftest (void) {return 0;} -int pj_wag1_selftest (void) {return 0;} -int pj_wag2_selftest (void) {return 0;} -int pj_wag3_selftest (void) {return 0;} -int pj_wag4_selftest (void) {return 0;} -int pj_wag5_selftest (void) {return 0;} -int pj_wag6_selftest (void) {return 0;} -int pj_wag7_selftest (void) {return 0;} -int pj_weren_selftest (void) {return 0;} -int pj_wink1_selftest (void) {return 0;} -int pj_wink2_selftest (void) {return 0;} +To be removed as real selftest functions are added to the projection +source files +***********************************************************************/ +int pj_aeqd_selftest (void) {return 10000;} +int pj_alsk_selftest (void) {return 10000;} + +int pj_calcofi_selftest (void) {return 10000;} +int pj_cass_selftest (void) {return 10000;} +int pj_cc_selftest (void) {return 10000;} +int pj_cea_selftest (void) {return 10000;} +int pj_chamb_selftest (void) {return 10000;} +int pj_collg_selftest (void) {return 10000;} +int pj_comill_selftest (void) {return 10000;} +int pj_crast_selftest (void) {return 10000;} +int pj_denoy_selftest (void) {return 10000;} +int pj_eck1_selftest (void) {return 10000;} +int pj_eck2_selftest (void) {return 10000;} +int pj_eck3_selftest (void) {return 10000;} +int pj_eck4_selftest (void) {return 10000;} +int pj_eck5_selftest (void) {return 10000;} +int pj_eck6_selftest (void) {return 10000;} +int pj_eqc_selftest (void) {return 10000;} +int pj_eqdc_selftest (void) {return 10000;} +int pj_euler_selftest (void) {return 10000;} +int pj_etmerc_selftest (void) {return 10000;} +int pj_fahey_selftest (void) {return 10000;} +int pj_fouc_selftest (void) {return 10000;} +int pj_fouc_s_selftest (void) {return 10000;} +int pj_gall_selftest (void) {return 10000;} +int pj_geos_selftest (void) {return 10000;} +int pj_geocent_selftest (void) {return 10000;} +int pj_gins8_selftest (void) {return 10000;} +int pj_gn_sinu_selftest (void) {return 10000;} +int pj_gnom_selftest (void) {return 10000;} +int pj_goode_selftest (void) {return 10000;} +int pj_gs48_selftest (void) {return 10000;} +int pj_gs50_selftest (void) {return 10000;} +int pj_hammer_selftest (void) {return 10000;} +int pj_hatano_selftest (void) {return 10000;} +int pj_healpix_selftest (void) {return 10000;} +int pj_rhealpix_selftest (void) {return 10000;} +int pj_igh_selftest (void) {return 10000;} +int pj_imw_p_selftest (void) {return 10000;} +int pj_isea_selftest (void) {return 10000;} +int pj_kav5_selftest (void) {return 10000;} +int pj_kav7_selftest (void) {return 10000;} +int pj_krovak_selftest (void) {return 10000;} +int pj_labrd_selftest (void) {return 10000;} +int pj_laea_selftest (void) {return 10000;} +int pj_lagrng_selftest (void) {return 10000;} +int pj_larr_selftest (void) {return 10000;} +int pj_lask_selftest (void) {return 10000;} +int pj_latlon_selftest (void) {return 10000;} +int pj_latlong_selftest (void) {return 10000;} +int pj_lonlat_selftest (void) {return 10000;} +int pj_longlat_selftest (void) {return 10000;} +int pj_lcc_selftest (void) {return 10000;} +int pj_lcca_selftest (void) {return 10000;} + +int pj_lee_os_selftest (void) {return 10000;} +int pj_loxim_selftest (void) {return 10000;} +int pj_lsat_selftest (void) {return 10000;} +int pj_mbt_s_selftest (void) {return 10000;} +int pj_mbt_fps_selftest (void) {return 10000;} +int pj_mbtfpp_selftest (void) {return 10000;} +int pj_mbtfpq_selftest (void) {return 10000;} +int pj_mbtfps_selftest (void) {return 10000;} +int pj_merc_selftest (void) {return 10000;} +int pj_mil_os_selftest (void) {return 10000;} +int pj_mill_selftest (void) {return 10000;} +int pj_misrsom_selftest (void) {return 10000;} +int pj_moll_selftest (void) {return 10000;} +int pj_murd1_selftest (void) {return 10000;} +int pj_murd2_selftest (void) {return 10000;} +int pj_murd3_selftest (void) {return 10000;} +int pj_natearth_selftest (void) {return 10000;} +int pj_natearth2_selftest (void) {return 10000;} +int pj_nell_selftest (void) {return 10000;} +int pj_nell_h_selftest (void) {return 10000;} +int pj_nicol_selftest (void) {return 10000;} +int pj_nsper_selftest (void) {return 10000;} +int pj_nzmg_selftest (void) {return 10000;} +int pj_ob_tran_selftest (void) {return 10000;} +int pj_ocea_selftest (void) {return 10000;} +int pj_oea_selftest (void) {return 10000;} +int pj_omerc_selftest (void) {return 10000;} +int pj_ortho_selftest (void) {return 10000;} +int pj_patterson_selftest (void) {return 10000;} +int pj_pconic_selftest (void) {return 10000;} +int pj_poly_selftest (void) {return 10000;} +int pj_putp1_selftest (void) {return 10000;} +int pj_putp2_selftest (void) {return 10000;} +int pj_putp3_selftest (void) {return 10000;} +int pj_putp3p_selftest (void) {return 10000;} +int pj_putp4p_selftest (void) {return 10000;} +int pj_putp5_selftest (void) {return 10000;} +int pj_putp5p_selftest (void) {return 10000;} +int pj_putp6_selftest (void) {return 10000;} +int pj_putp6p_selftest (void) {return 10000;} +int pj_qua_aut_selftest (void) {return 10000;} +int pj_qsc_selftest (void) {return 10000;} +int pj_robin_selftest (void) {return 10000;} +int pj_rouss_selftest (void) {return 10000;} +int pj_rpoly_selftest (void) {return 10000;} +int pj_sch_selftest (void) {return 10000;} +int pj_sinu_selftest (void) {return 10000;} +int pj_somerc_selftest (void) {return 10000;} +int pj_stere_selftest (void) {return 10000;} +int pj_sterea_selftest (void) {return 10000;} +int pj_gstmerc_selftest (void) {return 10000;} +int pj_tcc_selftest (void) {return 10000;} +int pj_tcea_selftest (void) {return 10000;} +int pj_tissot_selftest (void) {return 10000;} +int pj_tmerc_selftest (void) {return 10000;} +int pj_tpeqd_selftest (void) {return 10000;} +int pj_tpers_selftest (void) {return 10000;} +int pj_ups_selftest (void) {return 10000;} +int pj_urm5_selftest (void) {return 10000;} +int pj_urmfps_selftest (void) {return 10000;} +int pj_utm_selftest (void) {return 10000;} +int pj_vandg_selftest (void) {return 10000;} +int pj_vandg2_selftest (void) {return 10000;} +int pj_vandg3_selftest (void) {return 10000;} +int pj_vandg4_selftest (void) {return 10000;} +int pj_vitk1_selftest (void) {return 10000;} +int pj_wag1_selftest (void) {return 10000;} +int pj_wag2_selftest (void) {return 10000;} +int pj_wag3_selftest (void) {return 10000;} +int pj_wag4_selftest (void) {return 10000;} +int pj_wag5_selftest (void) {return 10000;} +int pj_wag6_selftest (void) {return 10000;} +int pj_wag7_selftest (void) {return 10000;} +int pj_weren_selftest (void) {return 10000;} +int pj_wink1_selftest (void) {return 10000;} +int pj_wink2_selftest (void) {return 10000;} #endif diff --git a/src/pj_list.c b/src/pj_list.c index bb56ade9..a8f171ab 100644 --- a/src/pj_list.c +++ b/src/pj_list.c @@ -1,11 +1,56 @@ /* Projection System: default list of projections ** Use local definition of PJ_LIST_H for subset. */ + #define USE_PJ_LIST_H 1 #include "projects.h" -struct PJ_LIST *pj_get_list_ref() -{ + +#define PASTE(a,b) a##b + +/* Generate prototypes for projection functions */ +#define PROJ_HEAD(id, name) struct PJconsts *pj_##id(struct PJconsts*); +#include "pj_list.h" +#undef PROJ_HEAD + +/* Generate prototypes for projection selftest functions */ +#define PROJ_HEAD(id, name) int PASTE(pj_##id, _selftest) (void); +#include "pj_list.h" +#undef PROJ_HEAD + + +/* Generate extern declarations for description strings */ +#define PROJ_HEAD(id, name) extern char * const pj_s_##id; +#include "pj_list.h" +#undef PROJ_HEAD + + +/* Generate the null-terminated list of projection functions with associated mnemonics and descriptions */ +#define PROJ_HEAD(id, name) {#id, pj_##id, &pj_s_##id}, +struct PJ_LIST pj_list[] = { +#include "pj_list.h" + {0, 0, 0}, + }; +#undef PROJ_HEAD + + +/* Generate the null-terminated list of projection selftest functions with associated mnemonics */ +#define PROJ_HEAD(id, name) {#id, PASTE(pj_##id, _selftest)}, +struct PJ_SELFTEST_LIST pj_selftest_list[] = { +#include "pj_list.h" + {0, 0}, + }; +#undef PROJ_HEAD +#undef PASTE + + +struct PJ_LIST *pj_get_list_ref (void) { return pj_list; } + + +struct PJ_SELFTEST_LIST *pj_get_selftest_list_ref (void) { + return pj_selftest_list; +} + diff --git a/src/pj_run_selftests.c b/src/pj_run_selftests.c index 34a514f0..cede4961 100644 --- a/src/pj_run_selftests.c +++ b/src/pj_run_selftests.c @@ -25,36 +25,26 @@ * DEALINGS IN THE SOFTWARE. *****************************************************************************/ - #include <stdio.h> #define PJ_LIB__ #include <projects.h> -extern int pj_aea_selftest(void); -extern int pj_leac_selftest(void); -extern int pj_airy_selftest(void); -extern int pj_aitoff_selftest(void); -extern int pj_wintri_selftest(void); -extern int pj_august_selftest(void); -extern int pj_bacon_selftest(void); -extern int pj_apian_selftest(void); -extern int pj_ortel_selftest(void); -extern int pj_boggs_selftest(void); -extern int pj_bonne_selftest(void); -extern int pj_bipc_selftest(void); - - - -static void run_one_test (const char *mnemonic, int (testfunc)(void), int verbosity, int *n_ok, int *n_ko) { +static void run_one_test (const char *mnemonic, int (testfunc)(void), int verbosity, int *n_ok, int *n_ko, int *n_stubs) { int ret = testfunc (); - if (ret) - (*n_ko)++; - else - (*n_ok)++; + switch (ret) { + case 0: (*n_ok)++; break; + case 10000: (*n_stubs)++; break; + default: (*n_ko)++; + } - if (verbosity) - printf ("Testing: %8s - return code: %d\n", mnemonic, ret); + if (verbosity) { + if (ret==10000) + printf ("Testing: %10s - [stub]\n", mnemonic); + else + printf ("Testing: %10s - return code: %d\n", mnemonic, ret); + } + return; } @@ -64,27 +54,25 @@ int pj_run_selftests (int verbosity) { return 0; } #else + + int pj_run_selftests (int verbosity) { - int n_ok = 0, n_ko = 0; + int n_ok = 0, n_ko = 0, n_stubs = 0, i = 0; + + struct PJ_SELFTEST_LIST *tests = pj_get_selftest_list_ref (); + + if (0==tests) + printf ("This version of libproj is not configured for internal regression tests.\n"); if (verbosity) printf ("Running internal regression tests\n"); - run_one_test ("aea", pj_aea_selftest, verbosity, &n_ok, &n_ko); - run_one_test ("leac", pj_leac_selftest, verbosity, &n_ok, &n_ko); - run_one_test ("airy", pj_airy_selftest, verbosity, &n_ok, &n_ko); - run_one_test ("aitoff", pj_aitoff_selftest, verbosity, &n_ok, &n_ko); - run_one_test ("wintri", pj_wintri_selftest, verbosity, &n_ok, &n_ko); - run_one_test ("august", pj_august_selftest, verbosity, &n_ok, &n_ko); - run_one_test ("bacon", pj_bacon_selftest, verbosity, &n_ok, &n_ko); - run_one_test ("apian", pj_apian_selftest, verbosity, &n_ok, &n_ko); - run_one_test ("ortel", pj_ortel_selftest, verbosity, &n_ok, &n_ko); - run_one_test ("boggs", pj_boggs_selftest, verbosity, &n_ok, &n_ko); - run_one_test ("bonne", pj_bonne_selftest, verbosity, &n_ok, &n_ko); - run_one_test ("bipc", pj_bipc_selftest, verbosity, &n_ok, &n_ko); + + for (i = 0; tests[i].testfunc != 0; i++) + run_one_test (tests[i].id, tests[i].testfunc, verbosity, &n_ok, &n_ko, &n_stubs); if (0==verbosity) printf ("Internal regression tests done. "); - printf ("Total: %d, Failure: %d, Success: %d\n", n_ok+n_ko, n_ko, n_ok); + printf ("[Stubs: %d] Total: %d. Failure: %d. Success: %d\n", n_stubs, n_ok+n_ko, n_ko, n_ok); return n_ko; } #endif diff --git a/src/projects.h b/src/projects.h index 2b638e94..307b69bd 100644 --- a/src/projects.h +++ b/src/projects.h @@ -169,6 +169,13 @@ struct PJ_LIST { struct PJconsts *(*proj)(struct PJconsts*);/* projection entry point */ char * const *descr; /* description text */ }; + +/* Merging this into the PJ_LIST infrastructure is tempting, but may imply ABI breakage. Perhaps at next major version? */ +struct PJ_SELFTEST_LIST { + char *id; /* projection keyword */ + int (* testfunc)(void); /* projection entry point */ +}; + struct PJ_ELLPS { char *id; /* ellipse keyword name */ char *major; /* a= value */ @@ -301,24 +308,16 @@ PROJ_PARMS__ /* public API */ #include "proj_api.h" + /* Generate pj_list external or make list from include file */ + #ifndef USE_PJ_LIST_H extern struct PJ_LIST pj_list[]; -#else -#define PROJ_HEAD(id, name) \ - struct PJconsts *pj_##id(struct PJconsts*); extern char * const pj_s_##id; - -#include "pj_list.h" -#undef PROJ_HEAD -#define PROJ_HEAD(id, name) {#id, pj_##id, &pj_s_##id}, - struct PJ_LIST -pj_list[] = { -#include "pj_list.h" - {0, 0, 0}, - }; -#undef PROJ_HEAD +extern struct PJ_SELFTEST_LIST pj_selftest_list[]; #endif + + #ifndef PJ_ELLPS__ extern struct PJ_ELLPS pj_ellps[]; #endif @@ -571,6 +570,7 @@ struct PJ_ELLPS *pj_get_ellps_ref( void ); struct PJ_DATUMS *pj_get_datums_ref( void ); struct PJ_UNITS *pj_get_units_ref( void ); struct PJ_LIST *pj_get_list_ref( void ); +struct PJ_SELFTEST_LIST *pj_get_selftest_list_ref ( void ); struct PJ_PRIME_MERIDIANS *pj_get_prime_meridians_ref( void ); double pj_atof( const char* nptr ); |
