geo_coder 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|