aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/PJ_aea.c271
-rw-r--r--src/pj_list.c49
-rw-r--r--src/pj_run_selftests.c62
-rw-r--r--src/projects.h26
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 );