[mapcode] 25/32: Improved interface and renamed methods
Stefan Fritsch
sf at moszumanska.debian.org
Wed Nov 2 23:27:17 UTC 2016
This is an automated email from the git hooks/post-receive script.
sf pushed a commit to annotated tag v1.33
in repository mapcode.
commit 182a0af43e4ec2bd8b15ed396eb8bfcd3f513b14
Author: Rijn Buve <rijn at buve.nl>
Date: Tue Sep 2 11:56:32 2014 +0200
Improved interface and renamed methods
---
LICENSE | 202 +++++++++++
NOTICE | 4 +
README | 54 +++
README.txt | 41 ---
RELEASE_NOTES | 33 ++
mapcode.c => example/mapcode.c | 29 +-
mapcode_library.doc | Bin 0 -> 65536 bytes
{mapcoder => mapcodelib}/basics.h | 26 +-
{mapcoder => mapcodelib}/mapcoder.c | 698 +++++++++++++++++++-----------------
mapcodelib/mapcoder.h | 205 +++++++++++
mapcoder/mapcode_library.doc | Bin 61440 -> 0 bytes
mapcoder/mapcoder.h | 36 --
mapcoder/readme.txt | 27 --
13 files changed, 892 insertions(+), 463 deletions(-)
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000..7f734a7
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,4 @@
+Original C library created by Pieter Geelen. Work on Java version
+of the Mapcode library by Rijn Buve and Matthew Lowden.
+
+Copyright (C) 2014 Stichting Mapcode Foundation (http://www.mapcode.com)
diff --git a/README b/README
new file mode 100755
index 0000000..6337fef
--- /dev/null
+++ b/README
@@ -0,0 +1,54 @@
+-------------------------------------------------------------------------------
+Copyright (C) 2014 Stichting Mapcode Foundation (http://www.mapcode.com)
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------
+MAPCODE LIBRARY: mapcodelib/
+-------------------------------------------------------------------------------
+
+The directory 'mapcodelib' contains the files:
+
+ mapcoder.h <-- Header file with method prototypes and defines for caller.
+ mapcoder.c
+ basics.h
+
+Together these provide routine to encode/decode Mapcodes.
+
+Documentation, including example snippets of C source code, can be found in
+
+ mapcode_library.doc (Microsoft Word format).
+
+Also see www.mapcode.com for background and reference materials.
+
+Note: this version may be restricted to a particular area of the Earth!
+In that case, basics.h will state a version number of the for:
+ #define mapcode_cversion "1.2xxx"
+where "xxx" states the geographical limitation.
+
+-------------------------------------------------------------------------------
+EXAMPLE: example/
+-------------------------------------------------------------------------------
+
+The directory 'example' contains a Mapcode encoding/decoding utility, as an example
+of how to use the library.
+
+To build the original Mapcode tool, execute:
+
+ cd example
+ gcc mapcode.c -o mapcode
+
+For help, simply execute the binary file 'mapcode' without no arguments.
+This tool provides a rather extensive command-line interface to encode and
+decode Mapcodes.
diff --git a/README.txt b/README.txt
deleted file mode 100644
index 3ac1ab3..0000000
--- a/README.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-+----
-| Copyright (C) 2014 Stichting Mapcode Foundation
-| For terms of use refer to http://www.mapcode.com/downloads.html
-+----
-
-This directory contains the original C++ Mapcode sources and an application to
-- encode lat/lon to Mapcodes,
-- decode Mapcodes to lat/lon,
-- generate 3D uniformly distributed lat/lon pairs and their Mapcodes.
-
-To build the original Mapcode tool:
- gcc mapcode.c -o mapcode
-
-For help, simply execute 'mapcode' without no arguments. This will show you the
-help text:
-
-+----
-Usage:
- mapcode [-d | --decode] <default-territory-ISO3> <mapcode> [<mapcode> ...]
-
- Decode a Mapcode to a lat/lon. The default territory code is used if
- the Mapcode is a shorthand local code
-
- mapcode [-e | --encode] <lat:-90..90> <lon:-180..180> [territory-ISO3]>
-
- Encode a lat/lon to a Mapcode. If the territory code is specified, the
- encoding will only succeeed if the lat/lon is located in the territory.
-
- mapcode [-g | --generate] <nrPoints> [<seed>]
-
- Create a test set of a number of uniformly distributed lat/lon pairs,
- 3D x/y/z points and their Mapcodes). The output format is:
- <nr> <lat> <lon> <x> <y> <z>
- <territory> <mapcode> (repeated 'nr' rtimes)
- <1 empty line>
-
- The points will be uniformly distributed over the 3D surface of the Earth
- rather than using uniformly distributed lat/lon values.
- Ranges:
- nr > 1 lat = -90..90 lon = -180..180 x,y,z = -1..1
-+----
diff --git a/RELEASE_NOTES b/RELEASE_NOTES
new file mode 100644
index 0000000..9d7e35b
--- /dev/null
+++ b/RELEASE_NOTES
@@ -0,0 +1,33 @@
+-------------------------------------------------------------------------------
+MAPCODE LIBRARY - RELEASE NOTES
+-------------------------------------------------------------------------------
+
+1.33
+ Fix to not remove valid results just across the edge of a territory. Iimproved interface readability
+ and renamed methods to more readable forms.
+
+1.32
+ Added encodeLatLonToSingleMapcode(); fixed 1.29 so no country-wide alternative is produced in edge cases; prevent FIJI failing to
+ decode at exactly 180 degrees.
+
+1.31
+ Added compareWithMapcodeFormat().
+
+1.30
+ IUpdated the documentation and extended it with examples and suggestions.
+
+1.29
+ Also generate country-wide alternative mapcodes for states.
+
+1.28
+ Bug fix for the needless generation of 7-letter alternatives to short mapcodes in large states in India.
+
+1.27
+ Improved (faster) implementation of the function isInArea.
+
+1.26
+ Added alias OD ("Odisha") for indian state OR ("Orissa").
+
+1.25
+ Initial release to the public domain.
+
diff --git a/mapcode.c b/example/mapcode.c
similarity index 95%
rename from mapcode.c
rename to example/mapcode.c
index 8115e85..d3102d7 100644
--- a/mapcode.c
+++ b/example/mapcode.c
@@ -25,7 +25,7 @@
#include <stdio.h>
#include <math.h>
-#include "mapcoder/mapcoder.c"
+#include "../mapcodelib/mapcoder.c"
static const char* VERSION = "1";
static const int SELF_CHECK = 1;
@@ -38,7 +38,6 @@ static const int INTERNAL_ERROR = 2;
* Some global constants to be used.
*/
static const double PI = 3.14159265358979323846;
-static const int RESULTS_MAX = 64;
static const int SHOW_PROGRESS = 125;
static const double DELTA = 0.001;
@@ -169,11 +168,11 @@ static void convertLatLonToXYZ(double latDeg, double lonDeg, double* x, double*
* This methods provides a self check for encoding lat/lon to Mapcode.
*/
static void selfCheckLatLonToMapcode(const double lat, double lon, const char* territory, const char* mapcode) {
- int context = text2tc(territory, 0);
- char* results[RESULTS_MAX];
+ int context = convertTerritoryIsoNameToCode(territory, 0);
+ char* results[MAX_NR_OF_MAPCODE_RESULTS];
const double limitLat = (lat < -90.0) ? -90.0 : ((lat > 90.0) ? 90.0 : lat);
const double limitLon = (lon < -180.0) ? -180.0 : ((lon > 180.0) ? 180.0 : lon);
- const int nrResults = coord2mc(results, limitLat, limitLon, context);
+ const int nrResults = encodeLatLonToMapcodes(results, limitLat, limitLon, context);
if (nrResults <= 0) {
fprintf(stderr, "internal error: encoding lat/lon to Mapcode failure; "
"cannot encode lat=%f, lon=%f (default territory=%s)\n",
@@ -210,8 +209,8 @@ static void selfCheckMapcodeToLatLon(const char* territory, const char* mapcode,
const double lat, const double lon) {
double foundLat;
double foundLon;
- int foundContext = text2tc(territory, 0);
- int err = mc2coord(&foundLat, &foundLon, mapcode, foundContext);
+ int foundContext = convertTerritoryIsoNameToCode(territory, 0);
+ int err = decodeMapcodeToLatLon(&foundLat, &foundLon, mapcode, foundContext);
if (err != 0) {
fprintf(stderr, "internal error: decoding Mapcode to lat/lon failure; "
"cannot decode '%s %s')\n", territory, mapcode);
@@ -246,9 +245,9 @@ static void selfCheckMapcodeToLatLon(const char* territory, const char* mapcode,
*/
static void generateAndOutputMapcodes(double lat, double lon, int iShowError) {
- char* results[RESULTS_MAX];
+ char* results[MAX_NR_OF_MAPCODE_RESULTS];
int context = 0;
- const int nrResults = coord2mc(results, lat, lon, context);
+ const int nrResults = encodeLatLonToMapcodes(results, lat, lon, context);
if (nrResults <= 0) {
if (iShowError) {
fprintf(stderr, "error: cannot encode lat=%f, lon=%f)\n", lat, lon);
@@ -357,14 +356,14 @@ int main(const int argc, const char** argv)
double lon;
// Get the territory context.
- int context = text2tc(defaultTerritory, 0);
+ int context = convertTerritoryIsoNameToCode(defaultTerritory, 0);
// Decode every Mapcode.
for (int i = 3; i < argc; ++i) {
// Decode the Mapcode to a lat/lon.
const char* mapcode = argv[i];
- int err = mc2coord(&lat, &lon, mapcode, context);
+ int err = decodeMapcodeToLatLon(&lat, &lon, mapcode, context);
if (err != 0) {
fprintf(stderr, "error: cannot decode '%s %s'\n", defaultTerritory, mapcode);
return NORMAL_ERROR;
@@ -401,13 +400,13 @@ int main(const int argc, const char** argv)
int context = 0;
char* defaultTerritory = "AAA";
if (argc == 5) {
- context = text2tc(argv[4], 0);
+ context = convertTerritoryIsoNameToCode(argv[4], 0);
defaultTerritory = argv[4];
}
// Encode the lat/lon to a set of Mapcodes.
- char* results[RESULTS_MAX];
- const int nrResults = coord2mc(results, lat, lon, context);
+ char* results[MAX_NR_OF_MAPCODE_RESULTS];
+ const int nrResults = encodeLatLonToMapcodes(results, lat, lon, context);
if (nrResults <= 0) {
fprintf(stderr, "error: cannot encode lat=%f, lon=%f (default territory=%s)\n",
lat, lon, defaultTerritory);
@@ -437,7 +436,7 @@ int main(const int argc, const char** argv)
return NORMAL_ERROR;
}
- resetStatistics(NR_RECS);
+ resetStatistics(NR_BOUNDARY_RECS);
for (int i = 0; i < totalNrOfPoints; ++i) {
long minLonE6;
long maxLonE6;
diff --git a/mapcode_library.doc b/mapcode_library.doc
new file mode 100755
index 0000000..78c6f8e
Binary files /dev/null and b/mapcode_library.doc differ
diff --git a/mapcoder/basics.h b/mapcodelib/basics.h
similarity index 99%
rename from mapcoder/basics.h
rename to mapcodelib/basics.h
index 1dbb933..1cafe44 100755
--- a/mapcoder/basics.h
+++ b/mapcodelib/basics.h
@@ -1,15 +1,31 @@
+/*
+ * Copyright (C) 2014 Stichting Mapcode Foundation (http://www.mapcode.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
#define UWORD unsigned short int // 2-byte unsigned integer
#define mapcode_cversion "1.33"
#define MAXWIDE 10
#define BASEX 31
#define MAXFITLONG 6
-#define XSIDE3 168
+#define XSIDE3 168
#define YSIDE3 176
#define ALIASES "2UK=2UT,2CG=2CT,1GU=GUM,1UM=UMI,1VI=VIR,1PR=PRI,1AS=ASM,1MP=MNP,4JB=JBT,4QL=QLD,4TS=TAS,4CX=CXR,4CC=CCK,4NF=NFK,4HM=HMD,4NI=NFK,COL=5CL,5ME=5MX,MEX=5MX,5TM=TAM,5AG=AGU,5BC=BCN,5BS=BCS,5CM=CAM,5CS=CHP,5CH=CHH,5CO=COA,5DF=DIF,5DG=DUR,5GT=GUA,5GR=GRO,5HG=HID,5JA=JAL,5MI=MIC,5MO=MOR,5NA=NAY,5NL=NLE,5OA=OAX,5PB=PUE,5QE=QUE,5QR=ROO,5SL=SLP,5SI=SIN,5SO=SON,5TB=TAB,5TL=TLA,5VE=VER,5YU=YUC,5ZA=ZAC,811=8BJ,812=8TJ,813=8HE,814=8SX,815=8NM,821=8LN,822=8JL,823=8HL,831=8SH,832=8JS,833 [...]
-#define MAX_CCODE 541 // total number of areas (i.e. recognised iso codes) in this database
+#define MAX_MAPCODE_TERRITORY_CODE 541 // total number of areas (i.e. recognised iso codes) in this database
static char *entity_iso = ""
"VAT,MCO,GIB,TKL,CCK,BLM,NRU,TUV,MAC,SXM,"
"MAF,NFK,PCN,BVT,BMU,IOT,SMR,GGY,AIA,MSR,"
@@ -152,7 +168,7 @@ static char encode_chars[31] = {
};
-static UWORD data_start[MAX_CCODE+1] = {
+static UWORD data_start[MAX_MAPCODE_TERRITORY_CODE+1] = {
0, 3, 6, 9, 13, 16, 18, 19, 30, 31,
33, 35, 37, 42, 44, 47, 51, 54, 56, 58,
60, 62, 64, 68, 71, 79, 81, 116, 121, 131,
@@ -210,13 +226,13 @@ static UWORD data_start[MAX_CCODE+1] = {
16130,16162
};
-#define NR_RECS 16162
+#define NR_BOUNDARY_RECS 16162
#define WORST_RECS_PER_CCODE 195 // 8 Argentina @43
typedef struct { long minx; long miny; long maxx; long maxy; unsigned long flags; } mminforec;
#ifndef MAKE_SOURCE_DIGITAL
-static mminforec mminfo[NR_RECS+1] = {
+static mminforec mminfo[NR_BOUNDARY_RECS+1] = {
{ 12433114, 41851944, 12548434, 41938434,0x001002b},
{ 5850000, 35450000, 18560000, 55080000,0x50a0636},
{ 12444000, 41899000, 12460000, 41908000,0x003063c},
diff --git a/mapcoder/mapcoder.c b/mapcodelib/mapcoder.c
similarity index 87%
rename from mapcoder/mapcoder.c
rename to mapcodelib/mapcoder.c
index 85dca7c..af1d9d9 100755
--- a/mapcoder/mapcoder.c
+++ b/mapcodelib/mapcoder.c
@@ -1,4 +1,20 @@
-#include <string.h> // strlen strcpy strcat memcpy memmove strstr strchr memcmp
+/*
+ * Copyright (C) 2014 Stichting Mapcode Foundation (http://www.mapcode.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <string.h> // strlen strcpy strcat memcpy memmove strstr strchr memcmp
#include <stdlib.h> // atof
#include <ctype.h> // toupper
#include "mapcoder.h"
@@ -20,7 +36,7 @@
const char *cached_iso3="@"; // cache for ccode_of_iso3
char disambiguate_iso3[4] = { '1','?','?',0 } ; // cache for disambiguation
-char entity_iso3_result[4]; // cache for entity_iso3
+char entity_iso3_result[4]; // cache for entity_iso3
int current_ccode=-1; // cache for setup_country
@@ -47,12 +63,12 @@ int mIsMexicoState( int ccode ) { return (ccode>=mex_from && ccode<=mex_upto)
int mIsBrazilState( int ccode ) { return (ccode>=bra_from && ccode<=bra_upto); } // ccode_bra
int mIsChinaState( int ccode ) { return (ccode>=chn_from && ccode<=chn_upto); } // ccode_chn
int mIsRussiaState( int ccode ) { return (ccode>=rus_from && ccode<=rus_upto); } // ccode_rus
-int mIsState( int ccode ) { return mIsUsaState(ccode) || mIsIndiaState(ccode) || mIsCanadaState(ccode) || mIsAustraliaState(ccode) || mIsMexicoState(ccode) || mIsBrazilState(ccode) || mIsChinaState(ccode) || mIsRussiaState(ccode); }
+int mIsState( int ccode ) { return mIsUsaState(ccode) || mIsIndiaState(ccode) || mIsCanadaState(ccode) || mIsAustraliaState(ccode) || mIsMexicoState(ccode) || mIsBrazilState(ccode) || mIsChinaState(ccode) || mIsRussiaState(ccode); }
int rcodex(int m) { int c=mminfo[m].flags & 31; return 10*(c/5) + ((c%5)+1); }
int iscountry(int m) { return mminfo[m].flags & 32; }
int isnameless(int m) { return mminfo[m].flags & 64; }
-int pipetype(int m) { return (mminfo[m].flags>>7) & 3; }
+int pipetype(int m) { return (mminfo[m].flags>>7) & 3; }
int isuseless(int m) { return mminfo[m].flags & 512; }
int isSpecialShape22(int m) { return mminfo[m].flags & 1024; }
char pipeletter(int m) { return encode_chars[ (mminfo[m].flags>>11)&31 ]; }
@@ -61,7 +77,7 @@ long smartdiv(int m) { return (mminfo[m].flags>>16); }
#define getboundaries(m,minx,miny,maxx,maxy) get_boundaries(m,&(minx),&(miny),&(maxx),&(maxy))
void get_boundaries(int m,long *minx, long *miny, long *maxx, long *maxy )
{
- const mminforec *mm = &mminfo[m];
+ const mminforec *mm = &mminfo[m];
*minx = mm->minx;
*miny = mm->miny;
*maxx = mm->maxx;
@@ -76,9 +92,9 @@ void get_boundaries(int m,long *minx, long *miny, long *maxx, long *maxy )
void makeup(char *s) // strupr for latin
{
- char *t;
- for(t=s;*t!=0;t++)
- *t = toupper(*t);
+ char *t;
+ for(t=s;*t!=0;t++)
+ *t = toupper(*t);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -88,8 +104,8 @@ void makeup(char *s) // strupr for latin
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const char *entity_iso3(int ccode)
-{
- if (ccode<0 || ccode>=MAX_CCODE) ccode=ccode_earth; // solve bad args
+{
+ if (ccode<0 || ccode>=MAX_MAPCODE_TERRITORY_CODE) ccode=ccode_earth; // solve bad args
memcpy(entity_iso3_result,entity_iso+ccode*4,3);
entity_iso3_result[3]=0;
return entity_iso3_result;
@@ -110,7 +126,7 @@ int disambiguate_str( const char *s, int len ) // returns disambiguation >=1, or
if (len!=2 && len!=3) return -923; // solve bad args
memcpy(country,s,len); country[len]=0; makeup(country);
f=strstr(p,country);
- if (f==NULL)
+ if (f==NULL)
return -23; // unknown country
res = 1 + ((f-p)/(len+1));
disambiguate(res);
@@ -121,7 +137,7 @@ int disambiguate_str( const char *s, int len ) // returns disambiguation >=1, or
int ccode_of_iso3(const char *in_iso)
{
char iso[4];
- const char *s = cached_iso3; // assume cached index
+ const char *s = cached_iso3; // assume cached index
if (in_iso && in_iso[0] && in_iso[1] )
{
@@ -161,7 +177,7 @@ int ccode_of_iso3(const char *in_iso)
if (s==NULL)
{
s = strstr(aliases,disambiguate_iso3); // search in aliases
- if ( s && s[3]=='=' )
+ if ( s && s[3]=='=' )
{
memcpy(iso,s+4,3);
s = strstr(entity_iso,iso); // search disambiguated 2-letter iso
@@ -173,11 +189,11 @@ int ccode_of_iso3(const char *in_iso)
for(s=entity_iso-1;;)
{
s = strstr(s+1,disambiguate_iso3+1);
- if (s==NULL)
+ if (s==NULL)
+ break;
+ if (s && s[-1]>='1' && s[-1]<='9') {
+ s--;
break;
- if (s && s[-1]>='1' && s[-1]<='9') {
- s--;
- break;
}
}
if (s==NULL)
@@ -186,16 +202,16 @@ int ccode_of_iso3(const char *in_iso)
for(s=aliases-1;;)
{
s = strstr(s+1,disambiguate_iso3+1);
- if (s==NULL)
+ if (s==NULL)
break;
- if (s && s[-1]>='1' && s[-1]<='9') {
+ if (s && s[-1]>='1' && s[-1]<='9') {
memcpy(iso,s+3,3);
s = strstr(entity_iso,iso); // search disambiguated 2-letter iso
- break;
+ break;
}
}
}
-
+
if (s==NULL)
return -26;
cached_iso3 = s; // cache new result!
@@ -208,10 +224,10 @@ int ccode_of_iso3(const char *in_iso)
if (s==NULL)
{
s = strstr(aliases,iso); // search in aliases
- if ( s && s[3]=='=' )
+ if ( s && s[3]=='=' )
{
memcpy(iso,s+4,3);
- s = strstr(entity_iso,iso);
+ s = strstr(entity_iso,iso);
} else s=NULL;
}
if (s==NULL)
@@ -220,7 +236,7 @@ int ccode_of_iso3(const char *in_iso)
}
}
// return result
- return (s-entity_iso)/4;
+ return (s-entity_iso)/4;
}
@@ -234,19 +250,19 @@ int use_high_precision=0; // nr of letters of high-precision postfix (if any)
void addpostfix(char *result,long extrax4,long extray,long dividerx4,long dividery) // append extra characters to result for more precision
{
if (use_high_precision)
- {
+ {
long gx=((30*extrax4)/dividerx4);
long gy=((30*extray )/dividery );
- long x1=(gx/6);
+ long x1=(gx/6);
long x2=(gx%6);
- long y1=(gy/5);
+ long y1=(gy/5);
long y2=(gy%5);
// add postfix:
char *s = result+strlen(result);
*s++ = '-';
- *s++ = encode_chars[ y1*5+x1 ];
- if (use_high_precision==2)
- *s++ = encode_chars[ y2*6+x2 ];
+ *s++ = encode_chars[ y1*5+x1 ];
+ if (use_high_precision==2)
+ *s++ = encode_chars[ y2*6+x2 ];
*s++ = 0;
}
}
@@ -258,11 +274,11 @@ void add2res(long *nx,long *ny, long dividerx4,long dividery,int ydirection) //
if (*extrapostfix) {
int x1,y1,x2,y2,c1,c2;
c1 = extrapostfix[0];
- c1 = decode_chars[c1];
+ c1 = decode_chars[c1];
if (c1<0) c1=0; else if (c1>29) c1=29; // solves bugs in input
y1 =(c1/5); x1 = (c1%5);
c2 = (extrapostfix[1]) ? extrapostfix[1] : 72; // 72='H'=code 15=(3+2*6)
- c2 = decode_chars[c2];
+ c2 = decode_chars[c2];
if (c2<0) c2=0; else if (c2>29) c2=29; // solves bugs in input
y2 =(c2/6); x2 = (c2%6);
@@ -289,12 +305,12 @@ long x_divider( long miny, long maxy )
if (miny>=0) // both above equator? then miny is closest
return xdivider19[ (miny)>>19 ];
if (maxy>=0) // opposite sides? then equator is worst
- return xdivider19[0];
+ return xdivider19[0];
return xdivider19[ (-maxy)>>19 ]; // both negative, so maxy is closest to equator
}
int isInRange(long x,long minx,long maxx) // returns nonzero if x in the range minx...maxx
-{
+{
if ( minx<=x && x<maxx ) return 1;
if (x<minx) x+=360000000; else x-=360000000; // 1.32 fix FIJI edge case
if ( minx<=x && x<maxx ) return 1;
@@ -315,17 +331,17 @@ int isInArea(long x,long y,int ccode) // returns nonzero if x,y in area (i.e. ce
}
int findAreaFor(long x,long y,int ccode) // returns next ccode returns -1 when no more contain x,y; pass -1 the first time, pass previous ccode to find the next return value
-{
- while( (++ccode) < MAX_CCODE )
+{
+ while( (++ccode) < MAX_MAPCODE_TERRITORY_CODE )
if ( isInArea(x,y,ccode) )
- return ccode;
+ return ccode;
return -1;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
-// LOWEST-LEVEL BASE31 ENCODING/DECODING
+// LOWEST-LEVEL BASE31 ENCODING/DECODING
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -363,7 +379,7 @@ void encode_triple( char *result, long difx,long dify )
if ( dify < 4*34 ) // first 4(x34) rows of 6(x28) wide
{
fast_encode( result, ((difx/28) + 6*(dify/34)), 1 );
- fast_encode( result+1, ((difx%28)*34 +(dify%34)), 2 );
+ fast_encode( result+1, ((difx%28)*34 +(dify%34)), 2 );
}
else // bottom row
{
@@ -376,17 +392,17 @@ void encode_triple( char *result, long difx,long dify )
void decode_triple( const char *result, long *difx, long *dify )
{
// decode the first character
- int c1 = decode_chars[*result++];
+ int c1 = decode_chars[*result++];
if ( c1<24 )
{
long m = fast_decode(result);
*difx = (c1%6) * 28 + (m/34);
*dify = (c1/6) * 34 + (m%34);
- }
+ }
else // bottom row
{
long x = fast_decode(result);
- *dify = (x%40) + 136;
+ *dify = (x%40) + 136;
*difx = (x/40) + 24*(c1-24);
}
} // decode_triple
@@ -432,13 +448,13 @@ void decoderelative( char* r,long *nx,long *ny, long relx,long rely, long divide
long encode6( long x, long y, long width, long height )
{
long v;
- long D=6;
+ long D=6;
long col = x/6;
long maxcol = (width-4)/6;
if ( col>=maxcol )
{
col=maxcol;
- D = width-maxcol*6;
+ D = width-maxcol*6;
}
v = (height * 6 * col) + (height-1-y)*D + (x-col*6);
return v;
@@ -453,10 +469,10 @@ void decode6( long v, long width, long height, long *x, long *y )
if ( col>=maxcol )
{
col=maxcol;
- D = width-maxcol*6;
+ D = width-maxcol*6;
}
w = v - (col * height * 6 );
-
+
*x = col*6 + (w%D);
*y = height-1 - (w/D);
}
@@ -470,23 +486,23 @@ void decode_grid( const char* input,long *nx,long *ny, int m, long minx, long mi
if (codexlen>14) return; // solve bad args
strcpy(result,input);
- if (dc==1 && codexlen==5)
+ if (dc==1 && codexlen==5)
{
result[1]=result[2]; result[2]='.'; dc++;
}
-
+
{
long codexlow = codexlen-dc;
- long codex = 10*dc + codexlow;
+ long codex = 10*dc + codexlow;
long divx,divy;
divy = smartdiv(m);
- if (divy==1)
+ if (divy==1)
{
divx = xside[dc];
divy = yside[dc];
- }
- else
+ }
+ else
{
long pw = nc[dc];
divx = ( pw / divy );
@@ -500,7 +516,7 @@ void decode_grid( const char* input,long *nx,long *ny, int m, long minx, long mi
{
long relx,rely,v=0;
-
+
if ( dc <= MAXFITLONG )
{
v = fast_decode(result);
@@ -535,7 +551,7 @@ void decode_grid( const char* input,long *nx,long *ny, int m, long minx, long mi
decoderelative( result+dc+1,nx,ny, relx,rely, dividery,dividerx );
}
}
- }
+ }
}
} // decode_grid
@@ -544,11 +560,11 @@ void decode_grid( const char* input,long *nx,long *ny, int m, long minx, long mi
void encode_grid( char* result, long x,long y, int m, int codex, long minx, long miny, long maxx, long maxy )
{
- int orgcodex=codex;
+ int orgcodex=codex;
*result=0;
if ( maxx<=minx || maxy<=miny )
return;
- if (codex==14) codex=23;
+ if (codex==14) codex=23;
{ // encode
long divx,divy;
@@ -558,12 +574,12 @@ void encode_grid( char* result, long x,long y, int m, int codex, long minx, long
long pw = nc[dc];
divy = smartdiv(m);
- if (divy==1)
+ if (divy==1)
{
divx = xside[dc];
divy = yside[dc];
- }
- else
+ }
+ else
{
long pw = nc[dc];
divx = ( pw / divy );
@@ -571,8 +587,8 @@ void encode_grid( char* result, long x,long y, int m, int codex, long minx, long
}
{ // grid
- long ygridsize = (maxy-miny+divy-1)/divy;
- long xgridsize = (maxx-minx+divx-1)/divx;
+ long ygridsize = (maxy-miny+divy-1)/divy;
+ long xgridsize = (maxx-minx+divx-1)/divx;
long rely = y-miny;
long relx = x-minx;
@@ -586,7 +602,7 @@ void encode_grid( char* result, long x,long y, int m, int codex, long minx, long
}
rely /= ygridsize;
- relx /= xgridsize;
+ relx /= xgridsize;
if (relx>=divx || rely>=divy) return;
@@ -595,21 +611,21 @@ void encode_grid( char* result, long x,long y, int m, int codex, long minx, long
if ( divx!=divy && codex>24 )
v = encode6( relx,rely, divx,divy );
else
- v = relx*divy + (divy-1-rely);
+ v = relx*divy + (divy-1-rely);
fast_encode( result, v, dc);
} // prefix
-
+
if ( dc==4 && divx==xside[4] && divy==yside[4] )
{
char t = result[1]; result[1]=result[2]; result[2]=t;
}
-
+
rely = miny + (rely*ygridsize);
relx = minx + (relx*xgridsize);
-
+
{ // postfix
- long dividery = ( (((ygridsize))+yside[codexlow]-1)/yside[codexlow] );
- long dividerx = ( (((xgridsize))+xside[codexlow]-1)/xside[codexlow] );
+ long dividery = ( (((ygridsize))+yside[codexlow]-1)/yside[codexlow] );
+ long dividerx = ( (((xgridsize))+xside[codexlow]-1)/xside[codexlow] );
long extrax,extray;
{
@@ -622,7 +638,7 @@ void encode_grid( char* result, long x,long y, int m, int codex, long minx, long
*resultptr++ = '.';
extrax = difx % dividerx;
- extray = dify % dividery;
+ extray = dify % dividery;
difx /= dividerx;
dify /= dividery;
@@ -634,7 +650,7 @@ void encode_grid( char* result, long x,long y, int m, int codex, long minx, long
{
encode_triple( resultptr, difx,dify );
}
- else
+ else
{
fast_encode(resultptr, (difx)*yside[nrchars]+dify, nrchars );
// swap 4-long codes for readability
@@ -645,7 +661,7 @@ void encode_grid( char* result, long x,long y, int m, int codex, long minx, long
}
}
- if (orgcodex==14)
+ if (orgcodex==14)
{
result[2]=result[1]; result[1]='.';
}
@@ -663,11 +679,11 @@ void encode_grid( char* result, long x,long y, int m, int codex, long minx, long
// *********************************************************************************************************************
// indexes
-int iso_start;
-int iso_end;
+int iso_start;
+int iso_end;
// counts:
-int iso_count13;
+int iso_count13;
int iso_count21;
int iso_count22;
int iso_count23;
@@ -680,8 +696,8 @@ int iso_count43;
int iso_count44;
// first occurances
-int iso_first13;
-int iso_first21;
+int iso_first13;
+int iso_first21;
int iso_first22;
int iso_first23;
int iso_first32;
@@ -721,10 +737,10 @@ char iso_pipeletter34[32];
char iso_pipeletter44[32];
void setup_country( int newccode )
-{
- int iso_count14;
- int iso_first14;
-
+{
+ int iso_count14;
+ int iso_first14;
+
int iso_pipecount14;
int iso_pipecount22;
int iso_pipecount23;
@@ -737,13 +753,13 @@ void setup_country( int newccode )
if ( current_ccode!=newccode ) // cache check
{
- if (newccode<0 || newccode>=MAX_CCODE) newccode=ccode_earth; // solve bad args
+ if (newccode<0 || newccode>=MAX_MAPCODE_TERRITORY_CODE) newccode=ccode_earth; // solve bad args
current_ccode=newccode;
// init
iso_start=-1;
iso_end=-1;
-
+
iso_count13=0;
iso_count14=0;
iso_count21=0;
@@ -792,30 +808,30 @@ void setup_country( int newccode )
iso_firststar33=-1;
iso_firststar34=-1;
iso_firststar44=-1;
-
+
{
int i;
iso_start = firstrec(current_ccode);
- iso_end = lastrec(current_ccode);
-
- for ( i=iso_start; i<=iso_end; i++ )
- {
+ iso_end = lastrec(current_ccode);
+
+ for ( i=iso_start; i<=iso_end; i++ )
+ {
int codex = rcodex(i);
- int pipe = pipetype(i);
+ int pipe = pipetype(i);
- if ( codex==13 ) { iso_count13++; if ( iso_first13<0 ) iso_first13=i; }
+ if ( codex==13 ) { iso_count13++; if ( iso_first13<0 ) iso_first13=i; }
if ( codex==21 ) { iso_count21++; if ( iso_first21<0 ) iso_first21=i; }
- if ( codex==22 ) if (pipe) {if (iso_firstpipe22<0) iso_firstpipe22=i; if (pipe<2) iso_pipeletter22[iso_pipecount22++]=pipeletter(i); else if (iso_firststar22<0) iso_firststar22=i;} else { iso_count22++; if ( iso_first22<0 ) iso_first22=i; }
- if ( codex==14 ) if (pipe) {if (iso_firstpipe14<0) iso_firstpipe14=i; if (pipe<2) iso_pipeletter14[iso_pipecount14++]=pipeletter(i); else if (iso_firststar14<0) iso_firststar14=i;} else { iso_count14++; if ( iso_first14<0 ) iso_first14=i; }
- if ( codex==23 ) if (pipe) {if (iso_firstpipe23<0) iso_firstpipe23=i; if (pipe<2) iso_pipeletter23[iso_pipecount23++]=pipeletter(i); else if (iso_firststar23<0) iso_firststar23=i;} else { iso_count23++; if ( iso_first23<0 ) iso_first23=i; }
- if ( codex==32 ) if (pipe) {if (iso_firstpipe32<0) iso_firstpipe32=i; if (pipe<2) iso_pipeletter32[iso_pipecount32++]=pipeletter(i); else if (iso_firststar32<0) iso_firststar32=i;} else { iso_count32++; if ( iso_first32<0 ) iso_first32=i; }
- if ( codex==24 ) if (pipe) {if (iso_firstpipe24<0) iso_firstpipe24=i; if (pipe<2) iso_pipeletter24[iso_pipecount24++]=pipeletter(i); else if (iso_firststar24<0) iso_firststar24=i;} else { iso_count24++; if ( iso_first24<0 ) iso_first24=i; }
- if ( codex==33 ) if (pipe) {if (iso_firstpipe33<0) iso_firstpipe33=i; if (pipe<2) iso_pipeletter33[iso_pipecount33++]=pipeletter(i); else if (iso_firststar33<0) iso_firststar33=i;} else { iso_count33++; if ( iso_first33<0 ) iso_first33=i; }
- if ( codex==34 ) if (pipe) {if (iso_firstpipe34<0) iso_firstpipe34=i; if (pipe<2) iso_pipeletter34[iso_pipecount34++]=pipeletter(i); else if (iso_firststar34<0) iso_firststar34=i;} else { iso_count34++; if ( iso_first34<0 ) iso_first34=i; }
- if ( codex==42 ) { iso_count42++; if ( iso_first42<0 ) iso_first42=i; }
- if ( codex==43 ) { iso_count43++; if ( iso_first43<0 ) iso_first43=i; }
- if ( codex==44 ) if (pipe) {if (iso_firstpipe44<0) iso_firstpipe44=i; if (pipe<2) iso_pipeletter44[iso_pipecount44++]=pipeletter(i); else if (iso_firststar44<0) iso_firststar44=i;} else { iso_count44++; if ( iso_first44<0 ) iso_first44=i; }
+ if ( codex==22 ) if (pipe) {if (iso_firstpipe22<0) iso_firstpipe22=i; if (pipe<2) iso_pipeletter22[iso_pipecount22++]=pipeletter(i); else if (iso_firststar22<0) iso_firststar22=i;} else { iso_count22++; if ( iso_first22<0 ) iso_first22=i; }
+ if ( codex==14 ) if (pipe) {if (iso_firstpipe14<0) iso_firstpipe14=i; if (pipe<2) iso_pipeletter14[iso_pipecount14++]=pipeletter(i); else if (iso_firststar14<0) iso_firststar14=i;} else { iso_count14++; if ( iso_first14<0 ) iso_first14=i; }
+ if ( codex==23 ) if (pipe) {if (iso_firstpipe23<0) iso_firstpipe23=i; if (pipe<2) iso_pipeletter23[iso_pipecount23++]=pipeletter(i); else if (iso_firststar23<0) iso_firststar23=i;} else { iso_count23++; if ( iso_first23<0 ) iso_first23=i; }
+ if ( codex==32 ) if (pipe) {if (iso_firstpipe32<0) iso_firstpipe32=i; if (pipe<2) iso_pipeletter32[iso_pipecount32++]=pipeletter(i); else if (iso_firststar32<0) iso_firststar32=i;} else { iso_count32++; if ( iso_first32<0 ) iso_first32=i; }
+ if ( codex==24 ) if (pipe) {if (iso_firstpipe24<0) iso_firstpipe24=i; if (pipe<2) iso_pipeletter24[iso_pipecount24++]=pipeletter(i); else if (iso_firststar24<0) iso_firststar24=i;} else { iso_count24++; if ( iso_first24<0 ) iso_first24=i; }
+ if ( codex==33 ) if (pipe) {if (iso_firstpipe33<0) iso_firstpipe33=i; if (pipe<2) iso_pipeletter33[iso_pipecount33++]=pipeletter(i); else if (iso_firststar33<0) iso_firststar33=i;} else { iso_count33++; if ( iso_first33<0 ) iso_first33=i; }
+ if ( codex==34 ) if (pipe) {if (iso_firstpipe34<0) iso_firstpipe34=i; if (pipe<2) iso_pipeletter34[iso_pipecount34++]=pipeletter(i); else if (iso_firststar34<0) iso_firststar34=i;} else { iso_count34++; if ( iso_first34<0 ) iso_first34=i; }
+ if ( codex==42 ) { iso_count42++; if ( iso_first42<0 ) iso_first42=i; }
+ if ( codex==43 ) { iso_count43++; if ( iso_first43<0 ) iso_first43=i; }
+ if ( codex==44 ) if (pipe) {if (iso_firstpipe44<0) iso_firstpipe44=i; if (pipe<2) iso_pipeletter44[iso_pipecount44++]=pipeletter(i); else if (iso_firststar44<0) iso_firststar44=i;} else { iso_count44++; if ( iso_first44<0 ) iso_first44=i; }
}
}
@@ -856,7 +872,7 @@ int decode_nameless( const char *orginput, long *x, long *y, int input_c
int codexlen = strlen(orginput)-1;
int dc = (codex != 22) ? 2 : 3;
- if ( codexlen!=4 && codexlen!=5 )
+ if ( codexlen!=4 && codexlen!=5 )
return -2; // solve bad args
// copy without dot (its only 4 or 5 chars)
@@ -866,20 +882,20 @@ int decode_nameless( const char *orginput, long *x, long *y, int input_c
setup_country(input_ctry);
A = count_city_coordinates_for_country( codex );
- if ( (A<2 && codex!=21) || (codex==21 && A<1) )
- return -3;
-
+ if ( (A<2 && codex!=21) || (codex==21 && A<1) )
+ return -3;
+
{
int p = 31/A;
int r = 31%A;
long v;
int m;
- long SIDE;
+ long SIDE;
int swapletters=0;
long xSIDE;
long X=-1;
long miny,maxy,minx,maxx;
-
+
// make copy of input, so we can swap letters @@@@@@@@@@@@@@@
char result[32];
strcpy(result,input);
@@ -887,9 +903,9 @@ int decode_nameless( const char *orginput, long *x, long *y, int input_c
// now determine X = index of first area, and SIDE
if ( codex!=21 && A<=31 )
{
- int offset = decode_chars[*result];
+ int offset = decode_chars[*result];
- if ( offset < r*(p+1) )
+ if ( offset < r*(p+1) )
{
X = offset / (p+1);
}
@@ -899,10 +915,10 @@ int decode_nameless( const char *orginput, long *x, long *y, int input_c
X = r + (offset-(r*(p+1))) / p;
}
}
- else if ( codex!=21 && A<62 )
+ else if ( codex!=21 && A<62 )
{
- X = decode_chars[*result];
+ X = decode_chars[*result];
if ( X < (62-A) )
{
swapletters=(codex==22);
@@ -914,9 +930,9 @@ int decode_nameless( const char *orginput, long *x, long *y, int input_c
}
else // code==21 || A>=62
{
- long BASEPOWER = (codex==21) ? 961*961 : 961*961*31;
+ long BASEPOWER = (codex==21) ? 961*961 : 961*961*31;
long BASEPOWERA = (BASEPOWER/A);
-
+
if (A==62) BASEPOWERA++; else BASEPOWERA = 961*(BASEPOWERA/961);
v = fast_decode(result);
@@ -925,9 +941,9 @@ int decode_nameless( const char *orginput, long *x, long *y, int input_c
}
if (swapletters)
- {
- m = city_for_country( X,codex);
- if ( ! isSpecialShape22(m) )
+ {
+ m = city_for_country( X,codex);
+ if ( ! isSpecialShape22(m) )
{
char t = result[codexlen-3]; result[codexlen-3]=result[codexlen-2]; result[codexlen-2]=t;
}
@@ -941,10 +957,10 @@ int decode_nameless( const char *orginput, long *x, long *y, int input_c
if (X>0)
{
v -= (X*p + (X<r ? X : r)) * (961*961);
- }
-
+ }
+
}
- else if ( codex!=21 && A<62 )
+ else if ( codex!=21 && A<62 )
{
v = fast_decode(result+1);
@@ -952,14 +968,14 @@ int decode_nameless( const char *orginput, long *x, long *y, int input_c
if ( v >= (16*961*31) )
{
v -= (16*961*31);
- X++;
+ X++;
}
}
- m = city_for_country( X,codex);
+ m = city_for_country( X,codex);
SIDE = smartdiv(m);
- getboundaries(m,minx,miny,maxx,maxy);
+ getboundaries(m,minx,miny,maxx,maxy);
if ( isSpecialShape22(m) )
{
xSIDE = SIDE*SIDE;
@@ -975,18 +991,18 @@ int decode_nameless( const char *orginput, long *x, long *y, int input_c
{
long dx,dy;
- if ( isSpecialShape22(m) )
+ if ( isSpecialShape22(m) )
{
decode6(v,xSIDE,SIDE,&dx,&dy);
dy=SIDE-1-dy;
}
- else
+ else
{
- dy = v%SIDE;
+ dy = v%SIDE;
dx = v/SIDE;
}
- if ( dx>=xSIDE )
+ if ( dx>=xSIDE )
{
return -123;
}
@@ -1016,12 +1032,12 @@ void repack_if_alldigits(char *input)
char *e;
char *dotpos=NULL;
- for (e=s;*e!=0 && *e!='-';e++) if (*e<'0' || *e>'9') if (*e=='.' && !dotpos) dotpos=e; else { alldigits=0; break; }
- e--; s=e-1;
+ for (e=s;*e!=0 && *e!='-';e++) if (*e<'0' || *e>'9') if (*e=='.' && !dotpos) dotpos=e; else { alldigits=0; break; }
+ e--; s=e-1;
if (alldigits && dotpos && s>dotpos) // e is last char, s is one before, both are beyond dot, all characters are digits
{
const char *vowels="AEU";
- int v = ((*s)-'0') *10 + ((*e)-'0');
+ int v = ((*s)-'0') *10 + ((*e)-'0');
*s = vowels[v/34];
v%=34;
if (v<31) *e=encode_chars[v]; else if (v==31) *e='A'; else if (v==32) *e='E'; else *e='U';
@@ -1036,7 +1052,7 @@ int unpack_if_alldigits(char *input) // returns 1 if unpacked, 0 if left unchang
if (dotpos)
{
if ( *s=='a' || *s=='e' || *s=='u' || *s=='A' || *s=='E' || *s=='U' ) // thus, all digits, s[2]=0, after dot
- {
+ {
char *e=s+1; // s is vowel, e is lastchar
int v=0;
@@ -1049,7 +1065,7 @@ int unpack_if_alldigits(char *input) // returns 1 if unpacked, 0 if left unchang
else if (decode_chars[*e]<0) return -9; // invalid last character!
else v+=decode_chars[*e];
- if (v<100)
+ if (v<100)
{
*s = encode_chars[v/10];
*e = encode_chars[v%10];
@@ -1063,12 +1079,12 @@ int unpack_if_alldigits(char *input) // returns 1 if unpacked, 0 if left unchang
#define VERSION_1_32// 1.32 true recursive processing
#ifdef VERSION_1_32 // 1.32 true recursive processing
-int result_override=-1;
+int result_override=-1;
#endif
const char* makeiso(int cc,int longcode); // 0=short / 1=XX-YYY for states, XXX for country / 2=shortest unique
void addresult(char *resultbuffer, char *result, long x,long y, int ccode)
-{
+{
// add to global array (if any)
#ifdef VERSION_1_32 // 1.32 true recursive processing
if (result_override>=0) ccode=result_override; // 1.32 true recursive processing
@@ -1077,14 +1093,14 @@ void addresult(char *resultbuffer, char *result, long x,long y, int ccode)
global_results[nr_global_results]=global_buffer[nr_global_results];
strcpy(global_results[nr_global_results++],result);
global_results[nr_global_results]=global_buffer[nr_global_results];
- strcpy(global_results[nr_global_results++],makeiso(ccode,1));
+ strcpy(global_results[nr_global_results++],makeiso(ccode,1));
}
// add to buffer (if any)
if (resultbuffer)
{
if (*resultbuffer) strcat(resultbuffer," ");
strcat(resultbuffer,result);
- }
+ }
} // addresult
@@ -1095,64 +1111,64 @@ int encode_nameless( char *resultbuffer, char *result, long x, long y, int input
*result=0;
- setup_country(input_ctry);
- A = count_city_coordinates_for_country( CODEX );
+ setup_country(input_ctry);
+ A = count_city_coordinates_for_country( CODEX );
- // determine A = nr of 2.2
+ // determine A = nr of 2.2
if ( A>1 )
{
int p = 31/A;
int r = 31%A; // the first r items are p+1
long codexlen = (CODEX/10)+(CODEX%10);
// determine side of square around centre
- long SIDE;
+ long SIDE;
// now determine X = index of first area
- long X=0;
+ long X=0;
// loop through country records
- int j = (CODEX==21 ? iso_first21 : (CODEX==22 ? iso_first22 : iso_first13));
- int e = j+(CODEX==21 ? iso_count21 : (CODEX==22 ? iso_count22 : iso_count13));
+ int j = (CODEX==21 ? iso_first21 : (CODEX==22 ? iso_first22 : iso_first13));
+ int e = j+(CODEX==21 ? iso_count21 : (CODEX==22 ? iso_count22 : iso_count13));
for ( X=0; j<e; j++,X++ )
{
int m = (j);
-
- if (forcecoder<0 || forcecoder==m)
+
+ if (forcecoder<0 || forcecoder==m)
{
long storage_offset;
long miny,maxy;
- long minx,maxx;
+ long minx,maxx;
long xSIDE,orgSIDE;
if ( CODEX!=21 && A<=31 )
{
- int size=p; if (X<r) size++; // example: A=7, p=4 r=3: size(X)={5,5,5,4,4,4,4}
- storage_offset= (X*p + (X<r ? X : r)) * (961*961); // p=4,r=3: offset(X)={0,5,10,15,19,23,27}-31
+ int size=p; if (X<r) size++; // example: A=7, p=4 r=3: size(X)={5,5,5,4,4,4,4}
+ storage_offset= (X*p + (X<r ? X : r)) * (961*961); // p=4,r=3: offset(X)={0,5,10,15,19,23,27}-31
}
- else if ( CODEX!=21 && A<62 )
+ else if ( CODEX!=21 && A<62 )
{
if ( X < (62-A) )
- {
+ {
storage_offset = X*(961*961);
}
else
- {
+ {
storage_offset = (62-A + ((X-62+A)/2) )*(961*961);
if ( (X+A) & 1 )
{
- storage_offset += (16*961*31);
+ storage_offset += (16*961*31);
}
}
}
else
{
long BASEPOWER = (CODEX==21) ? 961*961 : 961*961*31;
- long BASEPOWERA = (BASEPOWER/A);
- if (A==62)
+ long BASEPOWERA = (BASEPOWER/A);
+ if (A==62)
BASEPOWERA++;
else
BASEPOWERA = (961) * (BASEPOWERA/961);
-
+
storage_offset = X * BASEPOWERA;
}
SIDE = smartdiv(m);
@@ -1160,13 +1176,13 @@ int encode_nameless( char *resultbuffer, char *result, long x, long y, int input
getboundaries(m,minx,miny,maxx,maxy);
orgSIDE=xSIDE=SIDE;
if ( isSpecialShape22(m) ) // - keep the existing rectangle!
- {
+ {
SIDE = 1+((maxy-miny)/90); // new side, based purely on y-distance
xSIDE = (orgSIDE*orgSIDE) / SIDE;
}
-
+
if ( miny<=y && y<maxy && isInRange(x,minx,maxx) )
{
long v = storage_offset;
@@ -1187,15 +1203,15 @@ int encode_nameless( char *resultbuffer, char *result, long x, long y, int input
{
v += (dx*SIDE + dy);
}
-
- fast_encode( result, v, codexlen+1 );
+
+ fast_encode( result, v, codexlen+1 );
{
int dotp=codexlen;
- if (CODEX==13)
+ if (CODEX==13)
dotp--;
memmove(result+dotp,result+dotp-1,4); result[dotp-1]='.';
}
-
+
if ( ! isSpecialShape22(m) )
if ( CODEX==22 && A<62 && orgSIDE==961 )
{
@@ -1204,14 +1220,14 @@ int encode_nameless( char *resultbuffer, char *result, long x, long y, int input
addpostfix(result,extrax4,extray,dividerx4,dividery);
- return m;
-
+ return m;
+
} // in range
-
- } // forcecoder?
+
+ } // forcecoder?
}
} // there are multiple 2.2 !
-
+
return -1;
} // encode_nameless
@@ -1221,7 +1237,7 @@ int encode_nameless( char *resultbuffer, char *result, long x, long y, int input
// returns nonzero if error
// -182 no countryname
int master_decode( long *nx,long *ny, // <- store result in nx,ny
- const char *org_input,
+ const char *org_input,
const char *default_cityname, int input_ctry, // <- context, in case input has no name, or no countryname
long debug_oldx,long debug_oldy // <- optional "original coordinates"
)
@@ -1229,16 +1245,16 @@ int master_decode( long *nx,long *ny, // <- store result in nx,ny
const char *dot=NULL;
int err=0;
int m=-1; // key record for decoding
-
+
int ilen=strlen(org_input);
char input[16]; if (ilen<5 || ilen>14) return -8; strcpy(input,org_input);
{
char *min = strchr(input,'-');
- if (min) {
- *min++=0;
+ if (min) {
+ *min++=0;
extrapostfix=&org_input[min-input];
- ilen=strlen(input);
+ ilen=strlen(input);
if (ilen>11) return -8;
} else extrapostfix="";
}
@@ -1247,12 +1263,12 @@ int master_decode( long *nx,long *ny, // <- store result in nx,ny
*nx=*ny=0; // reset to zero in case of error
{
- char *city = (char*)default_cityname;
+ char *city = (char*)default_cityname;
+
+
+
+
-
-
-
-
{
int voweled=0;
@@ -1265,7 +1281,7 @@ int master_decode( long *nx,long *ny, // <- store result in nx,ny
char *a=NULL; // position of letter A (if any) in the input
int nrd=0; // nr of true digits
{ char *s; for(s=input;*s!=0;s++) if (*s>='0' && *s<='9') nrd++; else if (*s=='.') if (dot) return -5; else dot=s; else if (*s=='a' || *s=='A') a=s; }
- if (dot==NULL)
+ if (dot==NULL)
return -2;
else if (a && a==input && nrd+2==ilen) // there is a dot, and an A as first letter, and everything else is a digit
{
@@ -1281,21 +1297,21 @@ int master_decode( long *nx,long *ny, // <- store result in nx,ny
// check if input has valid characters
{
- const char *s=input;
+ const char *s=input;
for ( ; *s!=0; s++ )
- if ( decode_chars[*s]<0 && *s!='.' )
+ if ( decode_chars[*s]<0 && *s!='.' )
return -4; // invalid char
}
// analyse input
- {
+ {
{
int prelen = (dot-input);
int postlen = ilen-1-prelen;
if ( prelen<2 || postlen<2 || prelen+postlen>9 || postlen>4 )
return -3;
-
+
}
}
@@ -1313,39 +1329,39 @@ int master_decode( long *nx,long *ny, // <- store result in nx,ny
// special case: 43 or worse, for a state
if ( (ilen==8 || ilen==9) && iso_count43==1 && isuseless((iso_first43)) && ( mIsIndiaState((input_ctry )) || mIsMexicoState((input_ctry )) ) )
{
- input_ctry =
- mIsMexicoState((input_ctry )) ? ccode_mex :
- mIsIndiaState((input_ctry )) ? ccode_ind :
+ input_ctry =
+ mIsMexicoState((input_ctry )) ? ccode_mex :
+ mIsIndiaState((input_ctry )) ? ccode_ind :
CCODE_ERR;
setup_country(input_ctry);
}
else if ( ilen==9 && iso_count44==1 && isuseless((iso_first44)) && mIsState((input_ctry )) )
{
- input_ctry =
- mIsUsaState((input_ctry )) ? ccode_usa :
- mIsCanadaState((input_ctry )) ? ccode_can :
- mIsAustraliaState((input_ctry )) ? ccode_aus :
- mIsBrazilState((input_ctry )) ? ccode_bra :
- mIsChinaState((input_ctry )) ? ccode_chn :
- mIsRussiaState((input_ctry )) ? ccode_rus :
+ input_ctry =
+ mIsUsaState((input_ctry )) ? ccode_usa :
+ mIsCanadaState((input_ctry )) ? ccode_can :
+ mIsAustraliaState((input_ctry )) ? ccode_aus :
+ mIsBrazilState((input_ctry )) ? ccode_bra :
+ mIsChinaState((input_ctry )) ? ccode_chn :
+ mIsRussiaState((input_ctry )) ? ccode_rus :
CCODE_ERR;
setup_country(input_ctry);
}
-
- if (
- ( ilen==5 && input[2]=='.' && iso_count21==0 && iso_count22==1 )
- || ( ilen==5 && input[2]=='.' && iso_count21==1 )
- || ( ilen==6 && input[2]=='.' && iso_count23==1 )
- || ( ilen==6 && input[3]=='.' && iso_count32==1 )
- || ( ilen==7 && input[2]=='.' && iso_count24==1 )
- || ( ilen==7 && input[3]=='.' && iso_count33==1 )
- || ( ilen==7 && input[4]=='.' && iso_count42==1 )
- || ( ilen==8 && input[3]=='.' && iso_count34==1 )
- || ( ilen==8 && input[4]=='.' && iso_count43==1 )
- || ( ilen==9 && input[4]=='.' && iso_count44==1 )
+
+ if (
+ ( ilen==5 && input[2]=='.' && iso_count21==0 && iso_count22==1 )
+ || ( ilen==5 && input[2]=='.' && iso_count21==1 )
+ || ( ilen==6 && input[2]=='.' && iso_count23==1 )
+ || ( ilen==6 && input[3]=='.' && iso_count32==1 )
+ || ( ilen==7 && input[2]=='.' && iso_count24==1 )
+ || ( ilen==7 && input[3]=='.' && iso_count33==1 )
+ || ( ilen==7 && input[4]=='.' && iso_count42==1 )
+ || ( ilen==8 && input[3]=='.' && iso_count34==1 )
+ || ( ilen==8 && input[4]=='.' && iso_count43==1 )
+ || ( ilen==9 && input[4]=='.' && iso_count44==1 )
)
{
- long minx,miny,maxx,maxy;
+ long minx,miny,maxx,maxy;
if ( ilen==5 && iso_count21==1) m = (iso_first21);
if ( ilen==5 && iso_count21==0) m = (iso_first22);
if ( ilen==6 && input[2]=='.' ) m = (iso_first23);
@@ -1360,13 +1376,13 @@ int master_decode( long *nx,long *ny, // <- store result in nx,ny
getboundaries(m,minx,miny,maxx,maxy);
decode_grid( input,nx,ny, m, minx,miny,maxx,maxy);
- //
+ //
if (isuseless(m)) {
- int j,fitssomewhere=0;
+ int j,fitssomewhere=0;
for (j=iso_start; (j)<m; j++) { // look in previous rects
long minx,miny,maxx,maxy,xdiv8;
if (isuseless((j))) continue;
- getboundaries((j),minx,miny,maxx,maxy);
+ getboundaries((j),minx,miny,maxx,maxy);
// 1.33 fix to not remove valid results just across the edge of a territory
xdiv8 = x_divider(miny,maxy)/4; // should be /8 but there's some extra margin
if ( miny-60<=*ny && *ny<maxy+60 && isInRange(*nx,minx-xdiv8,maxx+xdiv8) ) { fitssomewhere=1; break; }
@@ -1400,26 +1416,26 @@ int master_decode( long *nx,long *ny, // <- store result in nx,ny
}
}
else if (
- ( ilen==7 && iso_firststar23>=0 && input[3]=='.')
- || ( ilen==6 && iso_firststar22>=0 && input[2]=='.')
+ ( ilen==7 && iso_firststar23>=0 && input[3]=='.')
+ || ( ilen==6 && iso_firststar22>=0 && input[2]=='.')
)
- {
+ {
int start = (ilen==6 ? iso_firststar22 : iso_firststar23);
int rctry = (start);
-
+
long STORAGE_START=0;
long value;
int j;
-
+
value = fast_decode(input); // decode top
value *= (961*31);
err=-1;
- for ( j=start; rcodex(j)==rcodex(start) && pipetype(j)>1; j++ )
+ for ( j=start; rcodex(j)==rcodex(start) && pipetype(j)>1; j++ )
{
- long minx,miny,maxx,maxy;
+ long minx,miny,maxx,maxy;
+
-
m=(j);
getboundaries(m,minx,miny,maxx,maxy);
@@ -1429,12 +1445,12 @@ int master_decode( long *nx,long *ny, // <- store result in nx,ny
long xdiv = x_divider(miny,maxy);
long W = ( (maxx-minx)*4 + (xdiv-1) ) / xdiv;
long product = W*H;
-
+
// decode
// round up to multiples of YSIDE3*XSIDE3...
H = YSIDE3*( (H+YSIDE3-1)/YSIDE3 );
W = XSIDE3*( (W+XSIDE3-1)/XSIDE3 );
- product = (W/XSIDE3)*(H/YSIDE3)*961*31;
+ product = (W/XSIDE3)*(H/YSIDE3)*961*31;
{
long GOODROUNDER = rcodex(m)>=23 ? (961*961*31) : (961*961);
if ( pipetype(m)==2 ) // *+ pipe!
@@ -1458,7 +1474,7 @@ int master_decode( long *nx,long *ny, // <- store result in nx,ny
long difx,dify;
decode_triple(input+ilen-3,&difx,&dify); // decode bottom 3 chars
{
- long vx = (value / (H/YSIDE3))*XSIDE3 + difx; // is vx/168
+ long vx = (value / (H/YSIDE3))*XSIDE3 + difx; // is vx/168
long vy = (value % (H/YSIDE3))*YSIDE3 + dify; // is vy/176
*ny = maxy - vy*dividery;
*nx = minx + vx*dividerx;
@@ -1472,7 +1488,7 @@ int master_decode( long *nx,long *ny, // <- store result in nx,ny
}
}
-
+
break;
}
STORAGE_START += product;
@@ -1480,18 +1496,18 @@ int master_decode( long *nx,long *ny, // <- store result in nx,ny
} // for j
}
// ************** PIPELETTER 32 33 42 34 43 54=world
- else if (
+ else if (
( ilen== 6 && iso_firstpipe22>=0 && iso_firststar22<0 && input[3]=='.' ) // lettered 22-pipes -> 32
|| ( ilen== 7 && iso_firstpipe23>=0 && iso_firststar23<0 && input[3]=='.' ) // lettered 23-pipes -> 33
|| ( ilen== 7 && iso_firstpipe32>=0 && iso_firststar32<0 && input[4]=='.' ) // lettered 32-pipes -> 42
- || ( ilen== 7 && iso_firstpipe14>=0 && iso_firststar14<0 && input[2]=='.' ) // lettered 14-pipes -> 24
+ || ( ilen== 7 && iso_firstpipe14>=0 && iso_firststar14<0 && input[2]=='.' ) // lettered 14-pipes -> 24
|| ( ilen== 8 && iso_firstpipe24>=0 && iso_firststar24<0 && input[3]=='.' ) // lettered 24-pipes -> 34
|| ( ilen== 8 && iso_firstpipe33>=0 && iso_firststar33<0 && input[4]=='.' ) // lettered 33-pipes -> 43
|| ( ilen== 9 && iso_firstpipe34>=0 && iso_firststar34<0 && input[4]=='.' ) // lettered 34-pipes -> 44
|| ( ilen==10 && iso_firstpipe44>=0 && iso_firststar44<0 && input[5]=='.' ) // lettered 44-pipes -> 54
)
- {
- const char *pipeptr;
+ {
+ const char *pipeptr;
char letter=toupper(*input);
if (letter=='I') letter='1';
if (letter=='O') letter='0';
@@ -1501,7 +1517,7 @@ int master_decode( long *nx,long *ny, // <- store result in nx,ny
case 7: if (input[3]=='.') {
pipeptr = strchr(iso_pipeletter23,letter); if (pipeptr) m=(iso_firstpipe23+(pipeptr-iso_pipeletter23)); break;
}else if (input[2]=='.') {
- pipeptr = strchr(iso_pipeletter14,letter); if (pipeptr) m=(iso_firstpipe14+(pipeptr-iso_pipeletter14)); break;
+ pipeptr = strchr(iso_pipeletter14,letter); if (pipeptr) m=(iso_firstpipe14+(pipeptr-iso_pipeletter14)); break;
}else{
pipeptr = strchr(iso_pipeletter32,letter); if (pipeptr) m=(iso_firstpipe32+(pipeptr-iso_pipeletter32)); break;
}
@@ -1520,8 +1536,8 @@ int master_decode( long *nx,long *ny, // <- store result in nx,ny
}
else
{
- long minx,miny,maxx,maxy;
- ilen--;
+ long minx,miny,maxx,maxy;
+ ilen--;
getboundaries(m,minx,miny,maxx,maxy);
decode_grid( input+1,nx,ny, m, minx,miny,maxx,maxy);
err=0;
@@ -1543,7 +1559,7 @@ int master_decode( long *nx,long *ny, // <- store result in nx,ny
// * make sure it fits the country *
if (!ISEARTH(input_ctry))
{
- long minx,miny,maxx,maxy,xdiv8;
+ long minx,miny,maxx,maxy,xdiv8;
getboundaries((iso_end),minx,miny,maxx,maxy);
xdiv8 = x_divider(miny,maxy)/4; // should be /8 but there's some extra margin
if ( ! ( miny-45<=*ny && *ny<maxy+45 && isInRange(*nx,minx-xdiv8,maxx+xdiv8) ) ) // no fit?
@@ -1564,19 +1580,19 @@ int master_decode( long *nx,long *ny, // <- store result in nx,ny
// make sure resultbuffer is large enough!
// x,y = lon/lat times 1.000.000
-void master_encode( char *resultbuffer, int the_ctry, long x, long y, int forcecoder, int stop_with_one_result, int allow_world, int skip_parentstate )
+void master_encode( char *resultbuffer, int the_ctry, long x, long y, int forcecoder, int stop_with_one_result, int allow_world, int skip_parentstate )
{
int result_ctry=the_ctry;
int i;
- if (resultbuffer) *resultbuffer=0;
-
+ if (resultbuffer) *resultbuffer=0;
+
if (the_ctry<0) return;
if (y> 90000000) y-=180000000; else if (y< -90000000) y+=180000000;
if (x>179999999) x-=360000000; else if (x<-180000000) x+=360000000;
-
+
///////////////////////////////////////////////////////////
// turn into 3-letter ISO code!
- ///////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////
setup_country( the_ctry );
i=iso_start;
@@ -1603,14 +1619,14 @@ void master_encode( char *resultbuffer, int the_ctry, long x, long y, int forcec
int forcecoder_starpipe = (forcecoder>=0 && pipetype(forcecoder)>1 );
int result_counter=0;
*result=0;
- for( ; i<NR_RECS; i++ )
- {
+ for( ; i<NR_BOUNDARY_RECS; i++ )
+ {
int m=(i);
- int codex;
-
+ int codex;
+
if ( i==iso_end && isuseless(m) && mIsState(the_ctry) ) // last item is a reference to a state's country
- {
- if (skip_parentstate)
+ {
+ if (skip_parentstate)
return;
if (forcecoder>=0 ) // we would have found it the normal way!
return;
@@ -1619,25 +1635,25 @@ void master_encode( char *resultbuffer, int the_ctry, long x, long y, int forcec
result_override=the_ctry; // 1.32 true recursive processing
#endif
- the_ctry =
- mIsUsaState(the_ctry) ? ccode_usa :
- mIsCanadaState(the_ctry) ? ccode_can :
- mIsIndiaState(the_ctry) ? ccode_ind :
- mIsMexicoState(the_ctry) ? ccode_mex :
- mIsBrazilState(the_ctry) ? ccode_bra :
- mIsChinaState(the_ctry) ? ccode_chn :
- mIsRussiaState(the_ctry) ? ccode_rus :
+ the_ctry =
+ mIsUsaState(the_ctry) ? ccode_usa :
+ mIsCanadaState(the_ctry) ? ccode_can :
+ mIsIndiaState(the_ctry) ? ccode_ind :
+ mIsMexicoState(the_ctry) ? ccode_mex :
+ mIsBrazilState(the_ctry) ? ccode_bra :
+ mIsChinaState(the_ctry) ? ccode_chn :
+ mIsRussiaState(the_ctry) ? ccode_rus :
ccode_aus;
-
+
#ifdef VERSION_1_32 // 1.32 true recursive processing
- master_encode( resultbuffer, the_ctry, x,y, forcecoder, stop_with_one_result,/*allow-world*/0,1 );
+ master_encode( resultbuffer, the_ctry, x,y, forcecoder, stop_with_one_result,/*allow-world*/0,1 );
result_override=-1;
return; /**/
#else
setup_country( the_ctry );
i=iso_start-1; continue;
-#endif
+#endif
}
if ( i>iso_end )
@@ -1645,8 +1661,8 @@ void master_encode( char *resultbuffer, int the_ctry, long x, long y, int forcec
if (forcecoder>=0 || !allow_world )
break;
// find first WORLD record...
- result_ctry=the_ctry=ccode_earth;
- setup_country(the_ctry);
+ result_ctry=the_ctry=ccode_earth;
+ setup_country(the_ctry);
// now process from here...
i=iso_start-1; continue;
}
@@ -1663,7 +1679,7 @@ void master_encode( char *resultbuffer, int the_ctry, long x, long y, int forcec
getboundaries(m,minx,miny,maxx,maxy);
-
+
if ( isnameless(m) )
{
if ( y<miny || y>=maxy || !isInRange(x,minx,maxx) ) continue;
@@ -1675,20 +1691,20 @@ void master_encode( char *resultbuffer, int the_ctry, long x, long y, int forcec
}
}
}
- else if ( pipetype(m)>1 )
- {
+ else if ( pipetype(m)>1 )
+ {
if ( i<=iso_start || rcodex(i-1)!=codex || pipetype(i-1)<=1 ) // is this the FIRST starpipe?
{
STORAGE_START=0;
}
-
-
+
+
{
// determine how many cells
long H = (maxy-miny+89)/90; // multiple of 10m
long xdiv = x_divider(miny,maxy);
long W = ( (maxx-minx)*4 + (xdiv-1) ) / xdiv;
- long product = W*H;
+ long product = W*H;
// encodee
// round up to multiples of YSIDE3*XSIDE3...
@@ -1700,7 +1716,7 @@ void master_encode( char *resultbuffer, int the_ctry, long x, long y, int forcec
if ( pipetype(m)==2 ) // plus pipe
product = ((STORAGE_START+product+GOODROUNDER-1)/GOODROUNDER)*GOODROUNDER - STORAGE_START;
}
-
+
if ( ( !ISGOODAREA(forcecoder) || forcecoder==m ) && ( miny<=y && y<maxy && isInRange(x,minx,maxx) ) )
{
// encode
@@ -1712,8 +1728,8 @@ void master_encode( char *resultbuffer, int the_ctry, long x, long y, int forcec
long vy = (maxy-y)/dividery;
long extray = (maxy-y)%dividery;
- long codexlen = (codex/10)+(codex%10);
- long value = ((vx/XSIDE3)*(H/YSIDE3) + (vy/YSIDE3));
+ long codexlen = (codex/10)+(codex%10);
+ long value = ((vx/XSIDE3)*(H/YSIDE3) + (vy/YSIDE3));
// PIPELETTER ENCODE
fast_encode( result, (STORAGE_START/(961*31)) + value, codexlen-2 );
@@ -1725,8 +1741,8 @@ void master_encode( char *resultbuffer, int the_ctry, long x, long y, int forcec
{
#ifdef SUPPRESS_MULTIPLE_PIPES
- while ( i<iso_end && rcodex(i+1)==codex )
- i++;
+ while ( i<iso_end && rcodex(i+1)==codex )
+ i++;
#endif
}
@@ -1735,10 +1751,10 @@ void master_encode( char *resultbuffer, int the_ctry, long x, long y, int forcec
}
}
else // must be grid, possibly a multi-area
- {
- int multi_area = (pipetype(m)==1 ? 1 : 0); // has pipe letter?
+ {
+ int multi_area = (pipetype(m)==1 ? 1 : 0); // has pipe letter?
if (codex==21) if (iso_count21==1) codex=22; else continue;
-
+
if ( miny<=y && y<maxy && isInRange(x,minx,maxx) )
if ( codex!=55 ) // exclude Earth 55
{
@@ -1773,11 +1789,11 @@ void master_encode( char *resultbuffer, int the_ctry, long x, long y, int forcec
#ifndef REMOVE_VALIDCODE
int valid_code( const char *input ) // returns < 0 if invalid, 0 if potentially valid, 1 if potentially a complete code (i.e. from 2.2 to 5.4, using valid chars)
{
- const unsigned char *i = (const unsigned char *)input;
+ const unsigned char *i = (const unsigned char *)input;
int dots=0,prefix=0,postfix=0,alldigits=1,voweled=0;
for ( ; *i!=0; i++ )
{
- if ( *i=='.' )
+ if ( *i=='.' )
{
if ( dots++ )
return -1; // more than one dot!
@@ -1786,9 +1802,9 @@ int valid_code( const char *input ) // returns < 0 if invalid, 0 if potentially
}
else
{
- if ( decode_chars[*i]<0 )
+ if ( decode_chars[*i]<0 )
{
-
+
if ( decode_chars[*i]<-1 ) // i.e. A, E or U
{
if ( (*i=='A' || *i=='a') && i==(const unsigned char*)input ) // A is the first letter
@@ -1798,15 +1814,15 @@ int valid_code( const char *input ) // returns < 0 if invalid, 0 if potentially
}
else if (alldigits && !voweled && i[1]=='.') // vowel after digits just before dot
{
- voweled=1;
+ voweled=1;
}
else if (alldigits && voweled && i[1]==0 && i[-1]!='.') // last char of voweled entry, not right after dot?
- ;
+ ;
else
return -6; // invalid char: vowel
}
- else
-
+ else
+
{
return -3; // other invalid character
}
@@ -1816,27 +1832,27 @@ int valid_code( const char *input ) // returns < 0 if invalid, 0 if potentially
if (*i<'0' || *i>'9') // nondigit
{
alldigits=0;
- if (voweled && i[1]!=0) return -7; // nondigit in voweled entry, not in the last position: invalid
+ if (voweled && i[1]!=0) return -7; // nondigit in voweled entry, not in the last position: invalid
}
}
- if (dots)
+ if (dots)
{
- postfix++;
+ postfix++;
if (postfix>4) return -4; // more than 4 letters postfix
}
- else
+ else
{
prefix++;
if (prefix>5) return -5; // more than 5 letters prefix
}
}
- }
+ }
// return if it looks like a "complete" code (i.e. one that can be decoded
if ( postfix<2 ) return -8;
if (alldigits && !voweled) return -11;
// note: at this point, prefix is between 2 and 5, and postfix is between 2 and 4 (12 options)
- if ( postfix==4 )
+ if ( postfix==4 )
{
return 1; // the 4 options 2.4 3.4 4.4 5.4 are all possible!
}
@@ -1878,7 +1894,7 @@ char makeiso_bufbytes[16];
char *makeiso_buf;
const char* makeiso(int cc,int longcode) // 0=short / 1=XX-YYY for states, XXX for country / 2=shortest unique
{
- if (cc<0 || cc>=MAX_CCODE) return ""; else
+ if (cc<0 || cc>=MAX_MAPCODE_TERRITORY_CODE) return ""; else
{
int p=stateletter(cc);
const char* ei=entity_iso3(cc);
@@ -1903,7 +1919,7 @@ const char* makeiso(int cc,int longcode) // 0=short / 1=XX-YYY for states, XXX f
int resultlen(const char *result)
{
const char* hpos = strchr(result,'-');
- if (hpos)
+ if (hpos)
return hpos-result;
return strlen(result);
}
@@ -1916,7 +1932,7 @@ int mapcode_encode(char *result,long y, long x, const char *iso3, char *isofound
master_encode(result,cc,x,y,-1,1,1,0);
if (isofound)
{
- *isofound=0;
+ *isofound=0;
if (*result)
if (resultlen(result)==10)
strcpy(isofound,makeiso(ccode_earth,1));
@@ -1944,21 +1960,21 @@ int full_mapcode_decode(long *y, long *x, const char *iso3, const char *orginput
len=strlen(s);
if (len>31) len=31;
- memcpy(input,s,len); s=input; s[len]=0;
+ memcpy(input,s,len); s=input; s[len]=0;
{
char *min = strchr(s+4,'-');
- if (min) {
- *min++=0;
+ if (min) {
+ *min++=0;
extrapostfix=&orginput[min-s];
- len=strlen(s);
+ len=strlen(s);
} else extrapostfix="";
}
// remove trail
while (len>0 && s[len-1]>=0 && s[len-1]<=32) { s[--len]=0; }
-
+
if (len>0 && len<10 && ilen<7 && strchr(s,' ')==0) // no space in input (so just a mapcode?); and room for ISO-space-MAPCODE?
{
memmove(s+ilen+1,s,len+1);
@@ -1967,7 +1983,7 @@ int full_mapcode_decode(long *y, long *x, const char *iso3, const char *orginput
len+=(1+ilen);
iso3="";
}
-
+
if (len>8 && (s[3]==' ' || s[3]=='-') && (s[6]==' ' || s[7]==' ')) // assume ISO3 space|minus ISO23 space MAPCODE
{
@@ -1995,7 +2011,7 @@ int full_mapcode_decode(long *y, long *x, const char *iso3, const char *orginput
}
- while (*s>0 && *s<=32) {s++;len--;} // skip further whitespace
+ while (*s>0 && *s<=32) {s++;len--;} // skip further whitespace
// returns nonzero if error
ccode = ccode_of_iso3(iso3);
@@ -2004,8 +2020,8 @@ int full_mapcode_decode(long *y, long *x, const char *iso3, const char *orginput
if (ccode_found) *ccode_found=ccode;
{
- char *t;
- for(t=s;*t!=0;t++)
+ char *t;
+ for(t=s;*t!=0;t++)
{
if (*t>='a' && *t<='z') *t += ('A'-'a');
if (*t=='O') *t='0';
@@ -2070,7 +2086,7 @@ int mapcode_decode(long *y, long *x, const char *iso3, const char *orginput,int
#ifdef SUPPORT_FOREIGN_ALPHABETS
// WARNING - these alphabets have NOT yet been released as standard! use at your own risk! check www.mapcode.com for details.
-UWORD asc2lan[MAXLANS][36] = // A-Z equivalents for ascii characters A to Z, 0-9
+UWORD asc2lan[MAX_LANGUAGES][36] = // A-Z equivalents for ascii characters A to Z, 0-9
{
{0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a, 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039}, // roman
{0x0391,0x0392,0x039e,0x0394,0x003f,0x0395,0x0393,0x0397,0x0399,0x03a0,0x039a,0x039b,0x039c,0x039d,0x039f,0x03a1,0x0398,0x03a8,0x03a3,0x03a4,0x003f,0x03a6,0x03a9,0x03a7,0x03a5,0x0396, 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039}, // greek
@@ -2132,12 +2148,12 @@ const char *decode_utf16(const UWORD* s)
{
if ( *s>=1 && *s<='z' ) // normal ascii
*w++ = (char)(*s);
- else
+ else
{
int i,found=0;
for (i=0; unicode2asc[i].min!=0 ;i++)
{
- if ( *s>=unicode2asc[i].min && *s<=unicode2asc[i].max )
+ if ( *s>=unicode2asc[i].min && *s<=unicode2asc[i].max )
{
const char *cv = unicode2asc[i].convert;
if (*cv==0) cv="0123456789";
@@ -2161,13 +2177,13 @@ const UWORD* encode_utf16(const char *mapcode,int language) // convert mapcode t
const char *r = mapcode;
while( *r!=0 && w<e )
{
- char c = *r++;
+ char c = *r++;
if ( c>='a' && c<='z' ) c+=('A'-'a');
if ( c<0 || c>'Z' ) // not in any valid range?
*w++ = '?';
else if ( c<'A' ) // valid but not a letter (e.g. a dot, a space...)
*w++ = c; // leave untranslated
- else
+ else
*w++ = asc2lan[language][c-'A'];
}
*w=0;
@@ -2228,7 +2244,7 @@ const UWORD* encode_utf16(const char *mapcode,int language) // convert mapcode t
// pass fullcode=1 to recognise territory and mapcode, pass fullcode=0 to only recognise proper mapcode (without optional territory)
// returns 0 if ok, negative in case of error (where -999 represents "may BECOME a valid mapcode if more characters are added)
- int lookslikemapcode(const char *s,int fullcode)
+ int compareWithMapcodeFormat(const char *s,int fullcode)
{
int nondigits=0;
int state=(fullcode ? 0 : 18); // initial state
@@ -2236,7 +2252,7 @@ const UWORD* encode_utf16(const char *mapcode,int language) // convert mapcode t
int newstate,token;
// recognise token
if (*s>='0' && *s<='9') token=TOKENCHR;
- else if ((*s>='a' && *s<='z') || (*s>='A' && *s<='Z'))
+ else if ((*s>='a' && *s<='z') || (*s>='A' && *s<='Z'))
{ token=TOKENCHR; if (state!=11 && state!=12) nondigits++; }
else if (*s=='.' ) token=TOKENDOT;
else if (*s=='-' ) token=TOKENHYPH;
@@ -2244,14 +2260,14 @@ const UWORD* encode_utf16(const char *mapcode,int language) // convert mapcode t
else if (*s==' ' || *s=='\t') token=TOKENSEP;
else return -4; // invalid character
newstate = fullmc_statemachine[state][token];
- if (newstate==ERR)
+ if (newstate==ERR)
return -(1000+10*state+token);
- if (newstate==GO )
+ if (newstate==GO )
return (nondigits>0 ? 0 : -5);
if (newstate==Prt)
return -999;
state=newstate;
- if (state==18)
+ if (state==18)
nondigits=0;
}
}
@@ -2259,7 +2275,7 @@ const UWORD* encode_utf16(const char *mapcode,int language) // convert mapcode t
int lookslike_mapcode(const char *s) // return -999 if partial, 0 if ok, negative if not
{
// old-style recognizer, does not suport territory context
- return lookslikemapcode(s,0);
+ return compareWithMapcodeFormat(s,0);
}
@@ -2285,12 +2301,12 @@ void asdms1(unsigned char *r,double v,long max,unsigned char degsym) // worst ca
if (v<0) { *r++='-'; v=-v; }
s = (long)(3600*v+0.5); // round to seconds
if (s>max) s=max;
- d=s/3600;
+ d=s/3600;
r=addnum(r,d,0,degsym);
s%=3600;
if (s)
{
- m=s/60;
+ m=s/60;
r=addnum(r,m,1,'\'');
s%=60;
if (s)
@@ -2312,7 +2328,7 @@ int interpret_coord( const unsigned char *i, int islat, double *result )
double d=0,m=0,s=0;
#define isdig(c) ((c)>='0' && (c)<='9')
- #define iswhite(c) ((c)>0 && (c)<=32)
+ #define iswhite(c) ((c)>0 && (c)<=32)
#define skipwhite(i) {while (iswhite(*i)) i++;}
#define skipnum(i) {while (isdig(*i)) i++;}
#define skipfp(i) {skipnum(i); if (*i=='.') {i++;skipnum(i);}}
@@ -2321,14 +2337,14 @@ int interpret_coord( const unsigned char *i, int islat, double *result )
// skip white spaces, signs and appropriate wind direction letters
char *p;
- int sign=1;
+ int sign=1;
while (*i && (p=strchr(winds,*i))!=NULL) { { if ( (p-winds) & 1 ) sign*=-1; } i++; }
// we are now at a lead digit, or there is an error
if (!isdig(*i))
return -12; // digit expected
-
+
while ( expnow<4 && isdig(*i) )
{
// get value
@@ -2340,10 +2356,10 @@ int interpret_coord( const unsigned char *i, int islat, double *result )
}
else if ( *i && strchr("\'`mM\x0B4\x093",*i) && i[1]!=i[0] ) // minute symbol (NOT repeated, else assume seconds symbol) $B4=180 $93=147
{
- i++; skipwhite(i);
+ i++; skipwhite(i);
m=v; expnow=2; // after minutes, expect seconds
}
- else if ( *i && strchr("\"\'`\x094\x084",*i) ) // seconds symbol? $94=148 $84=132
+ else if ( *i && strchr("\"\'`\x094\x084",*i) ) // seconds symbol? $94=148 $84=132
{
if (i[0]==i[1]) i++; i++; skipwhite(i);
s=v; expnow=3; // after seconds, expect something explicitly specified
@@ -2357,7 +2373,7 @@ int interpret_coord( const unsigned char *i, int islat, double *result )
// allow all posisble final endsigns
{ while (*i && (p=strchr(winds,*i))!=NULL) { if ( (p-winds) & 1 ) sign*=-1; i++; } }
-
+
// we now MUST be at the end of the string!
if (*i)
return -17; // trash trailing
@@ -2376,7 +2392,7 @@ int interpret_coords( unsigned char *i, double *x, double *y ) // returns negat
unsigned char *s;
unsigned char *firstcompass=NULL;
skipwhite(i); // skip leading nonsense
- for (s=i;*s!=0;s++)
+ for (s=i;*s!=0;s++)
{
switch (*s)
{
@@ -2392,8 +2408,8 @@ int interpret_coords( unsigned char *i, double *x, double *y ) // returns negat
case '.':
break;
case ' ':
- if (altsep) altsep=i; else altsep=s;
- while (*s==' ') s++;
+ if (altsep) altsep=i; else altsep=s;
+ while (*s==' ') s++;
s--;
break;
case ',': case 130:
@@ -2411,22 +2427,22 @@ int interpret_coords( unsigned char *i, double *x, double *y ) // returns negat
{
int e;
-
+
if (firstcompass && *firstcompass && strchr("EWew",*firstcompass))
{
- unsigned char t=*sep; *sep=0;
- e=interpret_coord(i,0,x);
- *sep=t;
+ unsigned char t=*sep; *sep=0;
+ e=interpret_coord(i,0,x);
+ *sep=t;
if (!e) e=interpret_coord(sep+1,1,y);
}
else
{
- unsigned char t=*sep; *sep=0;
- e=interpret_coord(i,1,y);
- *sep=t;
+ unsigned char t=*sep; *sep=0;
+ e=interpret_coord(i,1,y);
+ *sep=t;
if (!e) e=interpret_coord(sep+1,0,x);
}
-
+
if (e) return e;
}
@@ -2442,31 +2458,31 @@ int interpret_coords( unsigned char *i, double *x, double *y ) // returns negat
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-const char *tc2text(int tc,int format) // formats: 0=full 1=short (returns empty string in case of error)
+const char *convertTerritoryCodeToIsoName(int tc,int format) // formats: 0=full 1=short (returns empty string in case of error)
{
return makeiso(tc-1,(format==0));
}
-int tcparent(int tc) // returns negative if tc is not a code that has a parent country
+int getParentCountryOfState(int tc) // returns negative if tc is not a code that has a parent country
{
int parentccode=stateparent(tc-1); // returns parent ccode or -1
if (parentccode>=0) return parentccode+1;
return -1;
}
-int tccontext(int tc) // returns tc if tc is a country, parent country if tc is a state, -1 if tc is invalid
+int getCountryOrParentCountry(int tc) // returns tc if tc is a country, parent country if tc is a state, -1 if tc is invalid
{
- if (tc>0 && tc<MAX_CCODE)
+ if (tc>0 && tc<MAX_MAPCODE_TERRITORY_CODE)
{
- int tp=tcparent(tc);
+ int tp=getParentCountryOfState(tc);
if (tp>0) return tp;
return tc;
}
return -1;
}
-int text2tc(const char *string,int optional_tc) // optional_tc: pass 0 or negative if unknown
+int convertTerritoryIsoNameToCode(const char *string,int optional_tc) // optional_tc: pass 0 or negative if unknown
{
- int ccode = optional_tc-1;
+ int ccode = optional_tc-1;
if (string==NULL) return -1;
while (*string>0 && *string<=32) string++; // skip leading whitespace
if (ccode<0 || strchr(string,'-')>=0 || strlen(string)>3 )
@@ -2476,9 +2492,9 @@ int text2tc(const char *string,int optional_tc) // optional_tc: pass 0 or negati
else // there is a ccode, there is no hyphen in the string, and the string is as most 3 chars
{
char tmp[12];
- int tc = tccontext(optional_tc);
+ int tc = getCountryOrParentCountry(optional_tc);
- strcpy(tmp,tc2text(tc,1)); // short parent country code
+ strcpy(tmp,convertTerritoryCodeToIsoName(tc,1)); // short parent country code
strcat(tmp,"-");
strcat(tmp,string);
ccode=ccode_of_iso3(tmp);
@@ -2488,11 +2504,11 @@ int text2tc(const char *string,int optional_tc) // optional_tc: pass 0 or negati
// pass point to an array of pointers (at least 64), will be made to point to result strings...
// returns nr of results;
-int coord2mc_full( char **v, double lat, double lon, int tc, int stop_with_one_result ) // 1.31 allow to stop after one result
+int encodeLatLonToMapcodes_full( char **v, double lat, double lon, int tc, int stop_with_one_result ) // 1.31 allow to stop after one result
{
int ccode=tc-1;
if (tc==0) ccode=0;
- if (ccode<0 || ccode>=MAX_CCODE) return 0;
+ if (ccode<0 || ccode>=MAX_MAPCODE_TERRITORY_CODE) return 0;
if (lat<-90 || lat>90 || lon<-180 || lon>180) return 0;
lat*=1000000; if (lat<0) lat-=0.5; else lat+=0.5;
lon*=1000000; if (lon<0) lon-=0.5; else lon+=0.5;
@@ -2501,7 +2517,7 @@ int coord2mc_full( char **v, double lat, double lon, int tc, int stop_with_one_r
if (ccode==0)
{
int i;
- for(i=0;i<MAX_CCODE;i++) {
+ for(i=0;i<MAX_MAPCODE_TERRITORY_CODE;i++) {
master_encode(NULL,i,(long)lon,(long)lat,-1,stop_with_one_result,0,0); // 1.29 - also add parents recursively
if (stop_with_one_result && nr_global_results>0) break;
}
@@ -2515,46 +2531,50 @@ int coord2mc_full( char **v, double lat, double lon, int tc, int stop_with_one_r
}
// decode string into nx,ny; returns negative in case of error
-int mc2coord( double *lat, double *lon, const char *string, int context_tc ) // context_tc is used to disambiguate ambiguous short mapcode inputs; pass 0 or negative if not available
+int decodeMapcodeToLatLon( double *lat, double *lon, const char *string, int context_tc ) // context_tc is used to disambiguate ambiguous short mapcode inputs; pass 0 or negative if not available
{
- if (lat==NULL || lon==NULL || string==NULL)
+ if (lat==NULL || lon==NULL || string==NULL)
{
return -100;
}
else
{
long llat,llon;
- const char *iso3 = tc2text(context_tc,0);
+ const char *iso3 = convertTerritoryCodeToIsoName(context_tc,0);
int err=full_mapcode_decode(&llat,&llon,iso3,string,NULL,NULL);
*lat = llat/1000000.0;
*lon = llon/1000000.0;
+ if (*lat < -90.0) *lat = -90.0;
+ if (*lat > 90.0) *lat = 90.0;
+ if (*lon < -180.0) *lat = -180.0;
+ if (*lon > 180.0) *lat = 180.0;
return err;
}
}
#ifdef SUPPORT_FOREIGN_ALPHABETS
-const char *decode_to_roman(const UWORD* s)
+const char *decodeToRoman(const UWORD* s)
{
return decode_utf16(s);
}
-const UWORD* encode_to_alphabet(const char *mapcode,int alphabet) // 0=roman, 2=cyrillic
+const UWORD* encodeToAlphabet(const char *mapcode,int alphabet) // 0=roman, 2=cyrillic
{
return encode_utf16(mapcode,alphabet);
}
#endif
-int coord2mc( char **v, double lat, double lon, int tc )
+int encodeLatLonToMapcodes( char **v, double lat, double lon, int tc )
{
- return coord2mc_full(v,lat,lon,tc,0);
+ return encodeLatLonToMapcodes_full(v,lat,lon,tc,0);
}
-int coord2mc1( char *result, double lat, double lon, int tc )
+int encodeLatLonToSingleMapcode( char *result, double lat, double lon, int tc )
{
char *v[2];
- int ret=coord2mc_full(v,lat,lon,tc,1);
+ int ret=encodeLatLonToMapcodes_full(v,lat,lon,tc,1);
*result=0;
if (ret>0) {
if (strcmp(v[1],"AAA")!=0) {
diff --git a/mapcodelib/mapcoder.h b/mapcodelib/mapcoder.h
new file mode 100755
index 0000000..a04805d
--- /dev/null
+++ b/mapcodelib/mapcoder.h
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2014 Stichting Mapcode Foundation (http://www.mapcode.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#define RELEASENEAT // Use clean code (mapcoder.c).
+#define UWORD unsigned short int // 2-byte unsigned integer.
+#define SUPPORT_FOREIGN_ALPHABETS
+
+#define MAX_NR_OF_MAPCODE_RESULTS 64 // Max. number of results returned by encoder.
+#define MAX_MAPCODE_RESULT_LEN 24 // Max. number of characters in a single result.
+#define COMPARE_MAPCODE_MISSING_CHARACTERS -999 // Used for compareWithMapcodeFormat.
+
+/**
+ * Encode a latitude, longitude pair (in degrees) to a set of Mapcodes.
+ *
+ * Arguments:
+ * results - Results set of Mapcodes. The caller must pass an array of at least MAX_NR_OF_MAPCODE_RESULTS
+ * string points, which must NOT be allocated or de-allocated by the caller.
+ * The resulting strings are statically allocated by the library and will be overwritten
+ * by the next call to this method!
+ * lat - Latitude, in degrees. Range: -90..90.
+ * lon - Longitude, in degrees. Range: -180..180.
+ * territoryCode - Territory code (obtained from convertTerritoryIsoNameToCode), used as encoding context.
+ * Pass 0 to get Mapcodes for all territories.
+ *
+ * Returns:
+ * Number of results stored in parameter results. Always >= 0 (0 if no encoding was possible or an error occurred).
+ * The results are stored as pairs (Mapcode, territory name) in:
+ * (results[0], results[1])...(results[(2 * N) - 2], results[(2 * N) - 1])
+ */
+int encodeLatLonToMapcodes(
+ char** results,
+ double lat,
+ double lon,
+ int territoryCode);
+
+/**
+ * Encode a latitude, longitude pair (in degrees) to a single Mapcode: the shortest possible for the given territory
+ * (which can be 0 for all territories).
+ *
+ * Arguments:
+ * result - Returned Mapcode. The caller must not allocate or de-allocated this string.
+ * The resulting string MUST be allocated (and de-allocated) by the caller (contrary to
+ * encodeLatLonToMapcodes!).
+ * The caller should allocate at least MAX_MAPCODE_RESULT_LEN characters for the string.
+ * lat - Latitude, in degrees. Range: -90..90.
+ * lon - Longitude, in degrees. Range: -180..180.
+ * territoryCode - Territory code (obtained from convertTerritoryIsoNameToCode), used as encoding context.
+ * Pass 0 to get the shortest Mapcode for all territories.
+ *
+ * Returns:
+ * 0 if encoding failed, or >0 if it succeeded.
+ */
+int encodeLatLonToSingleMapcode(
+ char* result,
+ double lat,
+ double lon,
+ int territoryCode);
+
+/**
+ * Decode a Mapcode to a latitude, longitude pair (in degrees).
+ *
+ * Arguments:
+ * lat - Decoded latitude, in degrees. Range: -90..90.
+ * lon - Decoded longitude, in degrees. Range: -180..180.
+ * mapcode - Mapcode to decode.
+ * territoryCode - Territory code (obtained from convertTerritoryIsoNameToCode), used as decoding context.
+ * Pass 0 if not available.
+ * Returns:
+ * 0 if encoding failed, or >0 if it succeeded.
+ */
+int decodeMapcodeToLatLon(
+ double* lat,
+ double* lon,
+ const char* mapcode,
+ int territoryCode);
+
+/**
+ * Checks if a string has the format of a Mapcode. (Note: The method is called compareXXX rather than hasXXX because
+ * the return value '0' indicates the string has the Mapcode format, much like string comparison strcmp returns.)
+ *
+ * Arguments:
+ * check - Mapcode string to check.
+ * includesTerritory - If 0, no territory is includes in the string. If 1, territory information is
+ * supposed to be available in the string as well.
+ * Returns:
+ * 0 if the string has a correct Mapcode format; <0 if the string does not have a Mapcode format.
+ * Special value COMPARE_MAPCODE_MISSING_CHARACTERS (-999) indicates the string could be a Mapcode, but it seems
+ * to lack some characters.
+ */
+int compareWithMapcodeFormat(
+ const char* check,
+ int includesTerritory);
+
+/**
+ * Convert a territory name to a territory code.
+ *
+ * Arguments:
+ * isoNam - Territory name to convert.
+ * parentTerritory - Parent territory code, or 0 if not available.
+ *
+ * Returns:
+ * Territory code >= 0 if succeeded, or <0 if failed.
+ */
+int convertTerritoryIsoNameToCode(
+ const char* isoName,
+ int parentTerritoryCode);
+
+/**
+ * Convert a territory name to a territory code.
+ *
+ * Arguments:
+ * territoryCode - Territory code.
+ * format - Pass 0 for full name, 1 for short name (state codes may be ambiguous).
+ *
+ * Returns:
+ * Static result string or 0 if failed. The string is allocated by the library and must NOT be
+ * de-allocated by the caller. It will be overwritten by a subsequent call to this method!
+ */
+const char *convertTerritoryCodeToIsoName(
+ int territoryCode,
+ int format);
+
+/**
+ * Given a territory code, return the territory code itself it it was a country, or return its parent
+ * country territory if it was a state.
+ *
+ * Arguments:
+ * territoryCode - Country or state territory code.
+ *
+ * Returns:
+ * Territory code of the parent country (if the territoryCode indicated a state), or the territoryCode
+ * itself, if it was a country; <0 if the territoryCode was invalid.
+ */
+int getCountryOrParentCountry(int territoryCode);
+
+/**
+ * Given a territory code, return its parent country territory.
+ *
+ * Arguments:
+ * territoryCode - State territory code.
+ *
+ * Returns:
+ * Territory code of the parent country; <0 if the territoryCode was not a state or it was invalid.
+ */
+int getParentCountryOfState(int territoryCode);
+
+/**
+ * Languages:
+ */
+#define MAX_LANGUAGES 14
+#define MAPCODE_LANGUAGE_ROMAN 0
+#define MAPCODE_LANGUAGE_GREEK 1
+#define MAPCODE_LANGUAGE_CYRILLIC 2
+#define MAPCODE_LANGUAGE_HEBREW 3
+#define MAPCODE_LANGUAGE_HINDI 4
+#define MAPCODE_LANGUAGE_MALAI 5
+#define MAPCODE_LANGUAGE_GEORGIAN 6
+#define MAPCODE_LANGUAGE_KATAKANA 7
+#define MAPCODE_LANGUAGE_THAI 8
+#define MAPCODE_LANGUAGE_LAO 9
+#define MAPCODE_LANGUAGE_ARMENIAN 10
+#define MAPCODE_LANGUAGE_BENGALI 11
+#define MAPCODE_LANGUAGE_GURMUKHI 12
+#define MAPCODE_LANGUAGE_TIBETAN 13
+
+
+/**
+ * Decode a string to Roman characters.
+ *
+ * Arguments:
+ * string - String to decode.
+ *
+ * Returns:
+ * Decoded string. The string is allocated by the library and must NOT be
+ * de-allocated by the caller. It will be overwritten by a subsequent call to this method!
+ */
+const char* decodeToRoman(const UWORD* string);
+
+/**
+ * Encode a string to Alphabet characters for a language.
+ *
+ * Arguments:
+ * string - String to encode.
+ * alphabet - Alphabet to use. Currently supported are:
+ * 0 = roman, 2 = cyrillic, 4 = hindi, 12 = gurmukhi.
+ *
+ * Returns:
+ * Encoded string. The string is allocated by the library and must NOT be
+ * de-allocated by the caller. It will be overwritten by a subsequent call to this method!
+ */
+const UWORD* encodeToAlphabet(const char* mapcode, int alphabet);
diff --git a/mapcoder/mapcode_library.doc b/mapcoder/mapcode_library.doc
deleted file mode 100755
index aa0eba1..0000000
Binary files a/mapcoder/mapcode_library.doc and /dev/null differ
diff --git a/mapcoder/mapcoder.h b/mapcoder/mapcoder.h
deleted file mode 100755
index 38f84b7..0000000
--- a/mapcoder/mapcoder.h
+++ /dev/null
@@ -1,36 +0,0 @@
-
-#define RELEASENEAT // use clean code (mapcoder.c)
-#define CSVAPP // disable for isotable and for C library
-#define UWORD unsigned short int // 2-byte unsigned integer
-#define SUPPORT_FOREIGN_ALPHABETS
-
-
-// pass array of at least 64 strings, each at least 16 bytes
-// returns nr of results
-// pass tc=0 to get mapcodes in ALL territories
-int coord2mc( char **v, double lat, double lon, int tc ); // returns n = nr of results (stored in v[0]...v[2*n-1]
-
-// returns at most one mapcode (the shortest possible in the rettitory (or in ALL territories if tc=0 is passed); r must be large enough to store 24 characters including a zero terminator;
-int coord2mc1( char *result, double lat, double lon, int tc ); // returns positive in case of success (mapcode stored in result)
-
-// Converting a mapcode into a coordinate
-int mc2coord( double *lat, double *lon, const char *string, int context_tc ); // context_tc is used to disambiguate ambiguous short mapcode inputs; pass 0 or negative if not available
-
-// pass fullcode=1 to recognise territory and mapcode, pass fullcode=0 to only recognise proper mapcode (without optional territory)
-// returns 0 if ok, negative in case of error (where -999 represents "may BECOME a valid mapcode if more characters are added)
-int lookslikemapcode(const char *s,int fullcode);
-
-
-// Routines related to territories
-int text2tc(const char *string,int optional_tc); // returns negative, or tc
-// formats: 0=full 1=short (state codes may be ambiguous)
-const char *tc2text(int tc,int format); // returns temporary pointer to a string (will be destroyed by the next call)
-
-int tccontext(int tc); // returns tc if tc is a country, parent country if tc is a state, -1 if tc is invalid
-int tcparent(int tc); // returns tc of parent country (if tc is a state), or negative
-
-// Routines related to Unicode and/or foreign alphabets
-#define MAXLANS 14 // 0=Roman 1=Greek 2=Cyrillic 3=Hebrew 4=Hindi 5=Malai 6=Georgisch 7=Katakana 8=Thai 9=Lao 10=Armenian 11=Bengali 12=Gurmukhi 13=Tibetan
-const char *decode_to_roman(const UWORD* s);
-const UWORD* encode_to_alphabet(const char *mapcode,int alphabet); // 0=roman, 2=cyrillic, 4=hindi, 12=gurmukhi
-
diff --git a/mapcoder/readme.txt b/mapcoder/readme.txt
deleted file mode 100755
index eea3784..0000000
--- a/mapcoder/readme.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-The files
- basics.h
- mapcoder.c
- mapcoder.h
-together provide routine to encode/decode mapcodes.
-
-Documentation, including example snippets of C source code, can be found in
- mapcode_library.doc
-Also see www.mapcode.com for background and reference materials.
-
-Note: this version may be restricted to a particular area of the Earth!
-In that case, basics.h will state a version number of the for
- #define mapcode_cversion "1.2xxx"
-where "xxx" states the geographical limitation.
-
-
-version history
----------------
-1.25 initial release to the public domain
-1.26 added alias OD ("Odisha") for indian state OR ("Orissa")
-1.27 improved (faster) implementation of the function isInArea
-1.28 bug fix for the needless generation of 7-letter alternatives to short mapcodes in large states in India
-1.29 also generate country-wide alternative mapcodes for states
-1.30 updated the documentation and extended it with examples and suggestions
-1.31 added lookslikemapcode();
-1.32 added coord2mc1(); fixed 1.29 so no country-wide alternative is produced in edge cases; prevent FIJI failing to decode at exactly 180 degrees;
-1.33 fix to not remove valid results just across the edge of a territory
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/mapcode.git
More information about the Pkg-grass-devel
mailing list