diff options
| author | Thomas Knudsen <lastname DOT firstname AT gmail DOT com> | 2016-04-07 22:21:21 +0200 |
|---|---|---|
| committer | Thomas Knudsen <lastname DOT firstname AT gmail DOT com> | 2016-04-07 22:21:21 +0200 |
| commit | 2d111097d76ce52fb0ba019b20e02b33abe842ed (patch) | |
| tree | 8e73195c423859bd6926a843167fceeb054bc6ff /src | |
| parent | 2dc4630e3fb5cabb46a4678109e58aee7ab242d8 (diff) | |
| download | PROJ-2d111097d76ce52fb0ba019b20e02b33abe842ed.tar.gz PROJ-2d111097d76ce52fb0ba019b20e02b33abe842ed.zip | |
pj_list cleanup + added selftest stubs for all projections
The projection list maintained by code in pj_list.c depended on stuff in
projects.h.
This stuff is non-obvious and since it is only used in pj_list.c, it has
been moved from projects.h to pj_list.c (The material moved is based on
some really clever X-macro techniques implemented by numerous
redefinitions of the PROJ_HEAD macro, followed by immediate re-inclusion
of te pj_list.h file).
Also, the self test runner pj_run_selftests has been remodelled, now
depending on a list of self test functions, generated in a similar way
to the projection list, and like the projection list generated by
X-macro techniques in pj_list.c.
For this to work, self test functions need to be available for all
projections. To fulfill this, stubs for all projections not having self
tests already, have been added to PJ_aea.c
Along with the recent build system patches by @kbevers, this first part
of the macro-refactoring project is considered close to finished.
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 ); |
