geo_coder 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +12 -0
- data/Gemfile.lock +32 -0
- data/History.txt +6 -0
- data/Makefile +13 -0
- data/Manifest.txt +18 -0
- data/README.rdoc +197 -0
- data/Rakefile +53 -0
- data/TODO.txt +8 -0
- data/VERSION +1 -0
- data/bin/build_indexes +8 -0
- data/bin/rebuild_cluster +22 -0
- data/bin/rebuild_metaphones +23 -0
- data/bin/tiger_import +59 -0
- data/demos/demo/app/ext/geocodewrap.rb +84 -0
- data/demos/demo/app/views/index.builder +13 -0
- data/demos/demo/app/views/index.erb +71 -0
- data/demos/demo/config.ru +12 -0
- data/demos/demo/config/bootstraps.rb +130 -0
- data/demos/demo/config/geoenvironment.rb +25 -0
- data/demos/demo/geocoder_helper.rb +12 -0
- data/demos/demo/geocom_geocode.rb +10 -0
- data/demos/demo/main.rb +3 -0
- data/demos/demo/rakefile.rb +17 -0
- data/demos/demo/tmp/restart.txt +0 -0
- data/demos/simpledemo/views/index.builder +13 -0
- data/demos/simpledemo/views/index.erb +69 -0
- data/demos/simpledemo/ws.rb +83 -0
- data/doc/Makefile +7 -0
- data/doc/html4css1.css +279 -0
- data/doc/lookup.rst +193 -0
- data/doc/parsing.rst +125 -0
- data/doc/voidspace.css +147 -0
- data/geo_coder.gemspec +172 -0
- data/lib/geocoder/us.rb +21 -0
- data/lib/geocoder/us/address.rb +290 -0
- data/lib/geocoder/us/constants.rb +670 -0
- data/lib/geocoder/us/database.rb +745 -0
- data/lib/geocoder/us/import.rb +181 -0
- data/lib/geocoder/us/import/tiger.rb +13 -0
- data/lib/geocoder/us/numbers.rb +58 -0
- data/navteq/README +4 -0
- data/navteq/convert.sql +37 -0
- data/navteq/navteq_import +39 -0
- data/navteq/prepare.sql +92 -0
- data/sql/cluster.sql +16 -0
- data/sql/convert.sql +80 -0
- data/sql/create.sql +37 -0
- data/sql/index.sql +12 -0
- data/sql/place.csv +104944 -0
- data/sql/place.sql +104948 -0
- data/sql/setup.sql +78 -0
- data/src/Makefile +13 -0
- data/src/README +14 -0
- data/src/liblwgeom/Makefile +75 -0
- data/src/liblwgeom/box2d.c +54 -0
- data/src/liblwgeom/lex.yy.c +4799 -0
- data/src/liblwgeom/liblwgeom.h +1405 -0
- data/src/liblwgeom/lwalgorithm.c +946 -0
- data/src/liblwgeom/lwalgorithm.h +52 -0
- data/src/liblwgeom/lwcircstring.c +759 -0
- data/src/liblwgeom/lwcollection.c +541 -0
- data/src/liblwgeom/lwcompound.c +118 -0
- data/src/liblwgeom/lwcurvepoly.c +86 -0
- data/src/liblwgeom/lwgeom.c +886 -0
- data/src/liblwgeom/lwgeom_api.c +2201 -0
- data/src/liblwgeom/lwgparse.c +1219 -0
- data/src/liblwgeom/lwgunparse.c +1054 -0
- data/src/liblwgeom/lwline.c +525 -0
- data/src/liblwgeom/lwmcurve.c +125 -0
- data/src/liblwgeom/lwmline.c +137 -0
- data/src/liblwgeom/lwmpoint.c +138 -0
- data/src/liblwgeom/lwmpoly.c +141 -0
- data/src/liblwgeom/lwmsurface.c +129 -0
- data/src/liblwgeom/lwpoint.c +439 -0
- data/src/liblwgeom/lwpoly.c +579 -0
- data/src/liblwgeom/lwsegmentize.c +1047 -0
- data/src/liblwgeom/lwutil.c +369 -0
- data/src/liblwgeom/measures.c +861 -0
- data/src/liblwgeom/postgis_config.h +93 -0
- data/src/liblwgeom/ptarray.c +847 -0
- data/src/liblwgeom/vsprintf.c +179 -0
- data/src/liblwgeom/wktparse.h +126 -0
- data/src/liblwgeom/wktparse.lex +74 -0
- data/src/liblwgeom/wktparse.tab.c +2353 -0
- data/src/liblwgeom/wktparse.tab.h +145 -0
- data/src/liblwgeom/wktparse.y +385 -0
- data/src/libsqlite3_geocoder/Makefile +22 -0
- data/src/libsqlite3_geocoder/Makefile.nix +15 -0
- data/src/libsqlite3_geocoder/Makefile.redhat +15 -0
- data/src/libsqlite3_geocoder/extension.c +121 -0
- data/src/libsqlite3_geocoder/extension.h +13 -0
- data/src/libsqlite3_geocoder/levenshtein.c +42 -0
- data/src/libsqlite3_geocoder/metaphon.c +278 -0
- data/src/libsqlite3_geocoder/util.c +37 -0
- data/src/libsqlite3_geocoder/wkb_compress.c +54 -0
- data/src/metaphone/Makefile +7 -0
- data/src/metaphone/README +49 -0
- data/src/metaphone/extension.c +37 -0
- data/src/metaphone/metaphon.c +251 -0
- data/src/shp2sqlite/Makefile +37 -0
- data/src/shp2sqlite/Makefile.nix +36 -0
- data/src/shp2sqlite/Makefile.redhat +35 -0
- data/src/shp2sqlite/dbfopen.c +1595 -0
- data/src/shp2sqlite/getopt.c +695 -0
- data/src/shp2sqlite/getopt.h +127 -0
- data/src/shp2sqlite/shapefil.h +500 -0
- data/src/shp2sqlite/shp2sqlite.c +1974 -0
- data/src/shp2sqlite/shpopen.c +1894 -0
- data/tests/address.rb +236 -0
- data/tests/benchmark.rb +20 -0
- data/tests/constants.rb +57 -0
- data/tests/data/address-sample.csv +52 -0
- data/tests/data/db-test.csv +57 -0
- data/tests/data/locations.csv +4 -0
- data/tests/database.rb +137 -0
- data/tests/generate.rb +34 -0
- data/tests/numbers.rb +46 -0
- data/tests/run.rb +11 -0
- metadata +237 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# include <string.h>
|
|
2
|
+
# include <ctype.h>
|
|
3
|
+
|
|
4
|
+
int address_metaphone(const char *input, char *output, int max_phones) {
|
|
5
|
+
const char *n = input;
|
|
6
|
+
int i = 0;
|
|
7
|
+
if (isdigit(*n)) {
|
|
8
|
+
while (i < max_phones && isdigit(n[i]) && n[i] != '\0')
|
|
9
|
+
*output++ = n[i++];
|
|
10
|
+
*output = '\0';
|
|
11
|
+
return 1;
|
|
12
|
+
} else {
|
|
13
|
+
return metaphone(input, output, max_phones);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
signed int rindex_nondigit (const char *string) {
|
|
18
|
+
signed int i = strlen(string);
|
|
19
|
+
if (!i) return -1;
|
|
20
|
+
for (i--; i >= 0 && isdigit(string[i]); i--);
|
|
21
|
+
return i;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
signed int digit_suffix (const char *input, char *output) {
|
|
25
|
+
signed int i = rindex_nondigit(input);
|
|
26
|
+
strcpy(output, input+i+1);
|
|
27
|
+
return strlen(output);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
signed int nondigit_prefix (const char *input, char *output) {
|
|
31
|
+
signed int i = rindex_nondigit(input);
|
|
32
|
+
if (i++ >= 0) {
|
|
33
|
+
strncpy(output, input, i);
|
|
34
|
+
output[i] = '\0';
|
|
35
|
+
}
|
|
36
|
+
return i;
|
|
37
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#include <stdint.h>
|
|
2
|
+
#include <string.h>
|
|
3
|
+
|
|
4
|
+
uint32_t compress_wkb_line (void *dest, const void *src, uint32_t len) {
|
|
5
|
+
uint32_t d, s;
|
|
6
|
+
double value;
|
|
7
|
+
if (!len) return 0;
|
|
8
|
+
for (s = 9, d = 0; s < len; d += 4, s += 8) {
|
|
9
|
+
value = *(double *)(src + s);
|
|
10
|
+
value *= 1000000;
|
|
11
|
+
*(int32_t *)(dest + d) = (int32_t) value;
|
|
12
|
+
}
|
|
13
|
+
return d;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
uint32_t uncompress_wkb_line (void *dest, const void *src, uint32_t len) {
|
|
17
|
+
uint32_t d, s;
|
|
18
|
+
double value;
|
|
19
|
+
if (!len) return 0;
|
|
20
|
+
memcpy(dest, "\01\02\00\00\00\06\00\00\00", 10);
|
|
21
|
+
for (s = 0, d = 9; s < len; s += 4, d += 8) {
|
|
22
|
+
value = (double) *(int32_t *)(src + s);
|
|
23
|
+
value /= 1000000;
|
|
24
|
+
*(double *)(dest + d) = value;
|
|
25
|
+
}
|
|
26
|
+
return d;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
#ifdef TEST
|
|
31
|
+
|
|
32
|
+
#include <stdio.h>
|
|
33
|
+
int main (int argc, char *argv) {
|
|
34
|
+
char hex[1024], *scan;
|
|
35
|
+
char wkb[512];
|
|
36
|
+
unsigned long len, clen;
|
|
37
|
+
|
|
38
|
+
while (!feof(stdin)) {
|
|
39
|
+
fgets(hex, sizeof(hex), stdin);
|
|
40
|
+
for (scan = hex, len = 0; *scan && sizeof(wkb)>len; scan += 2, len++) {
|
|
41
|
+
if (sscanf(scan, "%2x", (uint32_t *)(wkb+len)) != 1) break;
|
|
42
|
+
}
|
|
43
|
+
clen = compress_wkb_line(hex, wkb, len);
|
|
44
|
+
printf("before: %lu, after: %lu\n", len, clen);
|
|
45
|
+
len = uncompress_wkb_line(wkb, hex, clen);
|
|
46
|
+
printf("before: %lu, after: %lu\n", clen, len);
|
|
47
|
+
for (scan = wkb + 9; scan < wkb + len; scan += 8) {
|
|
48
|
+
printf("%.6f ", *(double *)scan);
|
|
49
|
+
}
|
|
50
|
+
printf("\n");
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
#endif
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
= SQLite 3 Metaphone extension =
|
|
2
|
+
|
|
3
|
+
* This library implements the Metaphone algorithm, originally developed by
|
|
4
|
+
Laurence Phillips, as an SQLite 3 extension function:
|
|
5
|
+
|
|
6
|
+
http://en.wikipedia.org/wiki/Metaphone
|
|
7
|
+
|
|
8
|
+
* This code is based around the original public domain implementation in
|
|
9
|
+
C by Gary Phillips, as provided by Sadi Evren Seker:
|
|
10
|
+
|
|
11
|
+
http://www.shedai.net/c/new/METAPHON.C
|
|
12
|
+
|
|
13
|
+
* Like SQLite and the Phillips implementation of Metaphone, this code
|
|
14
|
+
is provided in the public domain, in the hope that it will be useful.
|
|
15
|
+
|
|
16
|
+
* To compile the code, simply run `make`. You must have GNU Make and GCC
|
|
17
|
+
installed.
|
|
18
|
+
|
|
19
|
+
* The module implements one function, metaphone(), which takes a string
|
|
20
|
+
to convert to a metaphone representation as its first argument, and an
|
|
21
|
+
optional second argument to specify the maximum length of the output.
|
|
22
|
+
|
|
23
|
+
* To use the code, run `sqlite3` and enter the following:
|
|
24
|
+
|
|
25
|
+
{{{
|
|
26
|
+
sqlite> .load /path/to/metaphone.so
|
|
27
|
+
-- you can use ./metaphone.so if the .so is in your
|
|
28
|
+
-- current directory, or just metaphone.so if it's
|
|
29
|
+
-- somewhere in your library path.
|
|
30
|
+
sqlite> select metaphone("Schuyler");
|
|
31
|
+
SKLR
|
|
32
|
+
sqlite> select metaphone("Schuyler", 3);
|
|
33
|
+
SKL
|
|
34
|
+
sqlite> select metaphone("Skyler");
|
|
35
|
+
SKLR
|
|
36
|
+
sqlite> select metaphone("Skylar");
|
|
37
|
+
SKLR
|
|
38
|
+
sqlite> select metaphone("SQLite rules!");
|
|
39
|
+
SKLTRLS
|
|
40
|
+
sqlite> select metaphone("SQLite roolz!!!1!");
|
|
41
|
+
SKLTRLS
|
|
42
|
+
}}}
|
|
43
|
+
|
|
44
|
+
Questions? Comments? Complaints? Approbation? Email schuyler@nocat.net.
|
|
45
|
+
|
|
46
|
+
Schuyler Erle
|
|
47
|
+
9 March 2008
|
|
48
|
+
|
|
49
|
+
=30=
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# include <sqlite3.h>
|
|
2
|
+
# include <sqlite3ext.h>
|
|
3
|
+
# include <stdio.h>
|
|
4
|
+
# include <string.h>
|
|
5
|
+
|
|
6
|
+
static SQLITE_EXTENSION_INIT1;
|
|
7
|
+
|
|
8
|
+
static void
|
|
9
|
+
sqlite3_metaphone (sqlite3_context *context, int argc, sqlite3_value **argv) {
|
|
10
|
+
const unsigned char *input = sqlite3_value_text(argv[0]);
|
|
11
|
+
int max_phones = 0;
|
|
12
|
+
char *output;
|
|
13
|
+
int len;
|
|
14
|
+
if (sqlite3_value_type(argv[0]) == SQLITE_NULL) {
|
|
15
|
+
sqlite3_result_null(context);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (argc > 1)
|
|
19
|
+
max_phones = sqlite3_value_int(argv[1]);
|
|
20
|
+
if (max_phones <= 0)
|
|
21
|
+
max_phones = strlen(input);
|
|
22
|
+
output = sqlite3_malloc((max_phones+1)*sizeof(char));
|
|
23
|
+
len = metaphone(input, output, max_phones);
|
|
24
|
+
sqlite3_result_text(context, output, len, SQLITE_TRANSIENT);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
int sqlite3_extension_init (sqlite3 * db, char **pzErrMsg,
|
|
28
|
+
const sqlite3_api_routines *pApi) {
|
|
29
|
+
SQLITE_EXTENSION_INIT2(pApi);
|
|
30
|
+
sqlite3_create_function(db, "metaphone", 1, SQLITE_ANY,
|
|
31
|
+
NULL, sqlite3_metaphone, NULL, NULL);
|
|
32
|
+
sqlite3_create_function(db, "metaphone", 2, SQLITE_ANY,
|
|
33
|
+
NULL, sqlite3_metaphone, NULL, NULL);
|
|
34
|
+
return 0;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/* +++Customized by SDE for sqlite3 use 09-Mar-2009 */
|
|
2
|
+
/* +++File obtained from http://www.shedai.net/c/new/METAPHON.C */
|
|
3
|
+
/* +++Date previously modified: 05-Jul-1997 */
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
** METAPHON.C - Phonetic string matching
|
|
7
|
+
**
|
|
8
|
+
** The Metaphone algorithm was developed by Lawrence Phillips. Like the
|
|
9
|
+
** Soundex algorithm, it compares words that sound alike but are spelled
|
|
10
|
+
** differently. Metaphone was designed to overcome difficulties encountered
|
|
11
|
+
** with Soundex.
|
|
12
|
+
**
|
|
13
|
+
** This implementation was written by Gary A. Parker and originally published
|
|
14
|
+
** in the June/July, 1991 (vol. 5 nr. 4) issue of C Gazette. As published,
|
|
15
|
+
** this code was explicitly placed in the public domain by the author.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#include <ctype.h>
|
|
19
|
+
#include <string.h> /* strlen() */
|
|
20
|
+
#include <stdio.h>
|
|
21
|
+
#define malloc(x) sqlite3_malloc((x))
|
|
22
|
+
#define free(x) sqlite3_free((x))
|
|
23
|
+
|
|
24
|
+
/*
|
|
25
|
+
** Character coding array
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
static char vsvfn[26] = {
|
|
29
|
+
1,16,4,16,9,2,4,16,9,2,0,2,2,2,1,4,0,2,4,4,1,0,0,0,8,0};
|
|
30
|
+
/* A B C D E F G H I J K L M N O P Q R S T U V W X Y Z */
|
|
31
|
+
|
|
32
|
+
/*
|
|
33
|
+
** Macros to access the character coding array
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
#define vowel(x) (vsvfn[(x) - 'A'] & 1) /* AEIOU */
|
|
37
|
+
#define same(x) (vsvfn[(x) - 'A'] & 2) /* FJLMNR */
|
|
38
|
+
#define varson(x) (vsvfn[(x) - 'A'] & 4) /* CGPST */
|
|
39
|
+
#define frontv(x) (vsvfn[(x) - 'A'] & 8) /* EIY */
|
|
40
|
+
#define noghf(x) (vsvfn[(x) - 'A'] & 16) /* BDH */
|
|
41
|
+
|
|
42
|
+
int metaphone(const char *Word, char *Metaph, int max_phones)
|
|
43
|
+
{
|
|
44
|
+
char *n, *n_start, *n_end; /* Pointers to string */
|
|
45
|
+
char *metaph_start = Metaph, *metaph_end;
|
|
46
|
+
/* Pointers to metaph */
|
|
47
|
+
int ntrans_len = strlen(Word)+4;
|
|
48
|
+
char *ntrans = (char *)malloc(sizeof(char) * ntrans_len);
|
|
49
|
+
/* Word with uppercase letters */
|
|
50
|
+
int KSflag; /* State flag for X translation */
|
|
51
|
+
|
|
52
|
+
/*
|
|
53
|
+
** Copy word to internal buffer, dropping non-alphabetic characters
|
|
54
|
+
** and converting to upper case.
|
|
55
|
+
*/
|
|
56
|
+
|
|
57
|
+
for (n = ntrans + 1, n_end = ntrans + ntrans_len - 2;
|
|
58
|
+
*Word && n < n_end; ++Word)
|
|
59
|
+
{
|
|
60
|
+
if (isalpha(*Word))
|
|
61
|
+
*n++ = toupper(*Word);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (n == ntrans + 1) {
|
|
65
|
+
free(ntrans);
|
|
66
|
+
Metaph[0]='\0';
|
|
67
|
+
return 1; /* Return if zero characters */
|
|
68
|
+
}
|
|
69
|
+
else n_end = n; /* Set end of string pointer */
|
|
70
|
+
|
|
71
|
+
/*
|
|
72
|
+
** Pad with '\0's, front and rear
|
|
73
|
+
*/
|
|
74
|
+
|
|
75
|
+
*n++ = '\0';
|
|
76
|
+
*n = '\0';
|
|
77
|
+
n = ntrans;
|
|
78
|
+
*n++ = '\0';
|
|
79
|
+
|
|
80
|
+
/*
|
|
81
|
+
** Check for PN, KN, GN, WR, WH, and X at start
|
|
82
|
+
*/
|
|
83
|
+
|
|
84
|
+
switch (*n)
|
|
85
|
+
{
|
|
86
|
+
case 'P':
|
|
87
|
+
case 'K':
|
|
88
|
+
case 'G':
|
|
89
|
+
if ('N' == *(n + 1))
|
|
90
|
+
*n++ = '\0';
|
|
91
|
+
break;
|
|
92
|
+
|
|
93
|
+
case 'A':
|
|
94
|
+
if ('E' == *(n + 1))
|
|
95
|
+
*n++ = '\0';
|
|
96
|
+
break;
|
|
97
|
+
|
|
98
|
+
case 'W':
|
|
99
|
+
if ('R' == *(n + 1))
|
|
100
|
+
*n++ = '\0';
|
|
101
|
+
else if ('H' == *(n + 1))
|
|
102
|
+
{
|
|
103
|
+
*(n + 1) = *n;
|
|
104
|
+
*n++ = '\0';
|
|
105
|
+
}
|
|
106
|
+
break;
|
|
107
|
+
|
|
108
|
+
case 'X':
|
|
109
|
+
*n = 'S';
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/*
|
|
114
|
+
** Now loop through the string, stopping at the end of the string
|
|
115
|
+
** or when the computed Metaphone code is max_phones characters long.
|
|
116
|
+
*/
|
|
117
|
+
|
|
118
|
+
KSflag = 0; /* State flag for KStranslation */
|
|
119
|
+
for (metaph_end = Metaph + max_phones, n_start = n;
|
|
120
|
+
n <= n_end && Metaph < metaph_end; ++n)
|
|
121
|
+
{
|
|
122
|
+
if (KSflag)
|
|
123
|
+
{
|
|
124
|
+
KSflag = 0;
|
|
125
|
+
*Metaph++ = *n;
|
|
126
|
+
}
|
|
127
|
+
else
|
|
128
|
+
{
|
|
129
|
+
/* Drop duplicates except for CC */
|
|
130
|
+
|
|
131
|
+
if (*(n - 1) == *n && *n != 'C')
|
|
132
|
+
continue;
|
|
133
|
+
|
|
134
|
+
/* Check for F J L M N R or first letter vowel */
|
|
135
|
+
|
|
136
|
+
if (same(*n) || (n == n_start && vowel(*n)))
|
|
137
|
+
*Metaph++ = *n;
|
|
138
|
+
else switch (*n)
|
|
139
|
+
{
|
|
140
|
+
case 'B':
|
|
141
|
+
if (n < n_end || *(n - 1) != 'M')
|
|
142
|
+
*Metaph++ = *n;
|
|
143
|
+
break;
|
|
144
|
+
|
|
145
|
+
case 'C':
|
|
146
|
+
if (*(n - 1) != 'S' || !frontv(*(n + 1)))
|
|
147
|
+
{
|
|
148
|
+
if ('I' == *(n + 1) && 'A' == *(n + 2))
|
|
149
|
+
*Metaph++ = 'X';
|
|
150
|
+
else if (frontv(*(n + 1)))
|
|
151
|
+
*Metaph++ = 'S';
|
|
152
|
+
else if ('H' == *(n + 1))
|
|
153
|
+
*Metaph++ = ((n == n_start &&
|
|
154
|
+
!vowel(*(n + 2))) ||
|
|
155
|
+
'S' == *(n - 1)) ? 'K' : 'X';
|
|
156
|
+
else *Metaph++ = 'K';
|
|
157
|
+
}
|
|
158
|
+
break;
|
|
159
|
+
|
|
160
|
+
case 'D':
|
|
161
|
+
*Metaph++ = ('G' == *(n + 1) && frontv(*(n + 2))) ?
|
|
162
|
+
'J' : 'T';
|
|
163
|
+
break;
|
|
164
|
+
|
|
165
|
+
case 'G':
|
|
166
|
+
if ((*(n + 1) != 'H' || vowel(*(n + 2))) &&
|
|
167
|
+
(*(n + 1) != 'N' || ((n + 1) < n_end &&
|
|
168
|
+
(*(n + 2) != 'E' || *(n + 3) != 'D'))) &&
|
|
169
|
+
(*(n - 1) != 'D' || !frontv(*(n + 1))))
|
|
170
|
+
{
|
|
171
|
+
*Metaph++ = (frontv(*(n + 1)) &&
|
|
172
|
+
*(n + 2) != 'G') ? 'J' : 'K';
|
|
173
|
+
}
|
|
174
|
+
else if ('H' == *(n + 1) && !noghf(*(n - 3)) &&
|
|
175
|
+
*(n - 4) != 'H')
|
|
176
|
+
{
|
|
177
|
+
*Metaph++ = 'F';
|
|
178
|
+
}
|
|
179
|
+
break;
|
|
180
|
+
|
|
181
|
+
case 'H':
|
|
182
|
+
if (!varson(*(n - 1)) && (!vowel(*(n - 1)) ||
|
|
183
|
+
vowel(*(n + 1))))
|
|
184
|
+
{
|
|
185
|
+
*Metaph++ = 'H';
|
|
186
|
+
}
|
|
187
|
+
break;
|
|
188
|
+
|
|
189
|
+
case 'K':
|
|
190
|
+
if (*(n - 1) != 'C')
|
|
191
|
+
*Metaph++ = 'K';
|
|
192
|
+
break;
|
|
193
|
+
|
|
194
|
+
case 'P':
|
|
195
|
+
*Metaph++ = ('H' == *(n + 1)) ? 'F' : 'P';
|
|
196
|
+
break;
|
|
197
|
+
|
|
198
|
+
case 'Q':
|
|
199
|
+
*Metaph++ = 'K';
|
|
200
|
+
break;
|
|
201
|
+
|
|
202
|
+
case 'S':
|
|
203
|
+
*Metaph++ = ('H' == *(n + 1) || ('I' == *(n + 1) &&
|
|
204
|
+
('O' == *(n + 2) || 'A' == *(n + 2)))) ?
|
|
205
|
+
'X' : 'S';
|
|
206
|
+
break;
|
|
207
|
+
|
|
208
|
+
case 'T':
|
|
209
|
+
if ('I' == *(n + 1) && ('O' == *(n + 2) ||
|
|
210
|
+
'A' == *(n + 2)))
|
|
211
|
+
{
|
|
212
|
+
*Metaph++ = 'X';
|
|
213
|
+
}
|
|
214
|
+
else if ('H' == *(n + 1))
|
|
215
|
+
*Metaph++ = 'O';
|
|
216
|
+
else if (*(n + 1) != 'C' || *(n + 2) != 'H')
|
|
217
|
+
*Metaph++ = 'T';
|
|
218
|
+
break;
|
|
219
|
+
|
|
220
|
+
case 'V':
|
|
221
|
+
*Metaph++ = 'F';
|
|
222
|
+
break;
|
|
223
|
+
|
|
224
|
+
case 'W':
|
|
225
|
+
case 'Y':
|
|
226
|
+
if (vowel(*(n + 1)))
|
|
227
|
+
*Metaph++ = *n;
|
|
228
|
+
break;
|
|
229
|
+
|
|
230
|
+
case 'X':
|
|
231
|
+
if (n == n_start)
|
|
232
|
+
*Metaph++ = 'S';
|
|
233
|
+
else
|
|
234
|
+
{
|
|
235
|
+
*Metaph++ = 'K';
|
|
236
|
+
KSflag = 1;
|
|
237
|
+
}
|
|
238
|
+
break;
|
|
239
|
+
|
|
240
|
+
case 'Z':
|
|
241
|
+
*Metaph++ = 'S';
|
|
242
|
+
break;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
*Metaph = '\0';
|
|
248
|
+
free(ntrans);
|
|
249
|
+
return strlen(metaph_start);
|
|
250
|
+
}
|
|
251
|
+
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# **********************************************************************
|
|
2
|
+
# * $Id: Makefile.in
|
|
3
|
+
# *
|
|
4
|
+
# * PostGIS - Spatial Types for PostgreSQL
|
|
5
|
+
# * http://postgis.refractions.net
|
|
6
|
+
# * Copyright 2008 Mark Cave-Ayland
|
|
7
|
+
# *
|
|
8
|
+
# * This is free software; you can redistribute and/or modify it under
|
|
9
|
+
# * the terms of the GNU General Public Licence. See the COPYING file.
|
|
10
|
+
# *
|
|
11
|
+
# **********************************************************************
|
|
12
|
+
|
|
13
|
+
CC=gcc
|
|
14
|
+
CFLAGS=-g -O2 -fPIC -DPIC -Wall -Wmissing-prototypes
|
|
15
|
+
|
|
16
|
+
# Filenames with extension as determined by the OS
|
|
17
|
+
SHP2SQLITE=shp2sqlite
|
|
18
|
+
LIBLWGEOM=../liblwgeom/liblwgeom.a
|
|
19
|
+
|
|
20
|
+
# iconv flags
|
|
21
|
+
ICONV_LDFLAGS=-lc
|
|
22
|
+
|
|
23
|
+
all: $(SHP2SQLITE)
|
|
24
|
+
|
|
25
|
+
$(LIBLWGEOM):
|
|
26
|
+
make -C ../liblwgeom
|
|
27
|
+
|
|
28
|
+
$(SHP2SQLITE): shpopen.o dbfopen.o getopt.o shp2sqlite.o $(LIBLWGEOM)
|
|
29
|
+
$(CC) -L/usr/local/libiconv/lib/ -liconv -I/usr/include $(CFLAGS) $^ $(ICONV_LDFLAGS) -lm -o $@
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
install: all
|
|
33
|
+
@cp $(SHP2SQLITE) ../../bin
|
|
34
|
+
|
|
35
|
+
clean:
|
|
36
|
+
@rm -f *.o $(SHP2SQLITE)
|
|
37
|
+
|