Menu

[r360]: / branches / sew-refactor / postgresql / pagc_api.h  Maximize  Restore  History

Download this file

1261 lines (1064 with data), 43.0 kB

   1
   2
   3
   4
   5
   6
   7
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
  29
  30
  31
  32
  33
  34
  35
  36
  37
  38
  39
  40
  41
  42
  43
  44
  45
  46
  47
  48
  49
  50
  51
  52
  53
  54
  55
  56
  57
  58
  59
  60
  61
  62
  63
  64
  65
  66
  67
  68
  69
  70
  71
  72
  73
  74
  75
  76
  77
  78
  79
  80
  81
  82
  83
  84
  85
  86
  87
  88
  89
  90
  91
  92
  93
  94
  95
  96
  97
  98
  99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 213
 214
 215
 216
 217
 218
 219
 220
 221
 222
 223
 224
 225
 226
 227
 228
 229
 230
 231
 232
 233
 234
 235
 236
 237
 238
 239
 240
 241
 242
 243
 244
 245
 246
 247
 248
 249
 250
 251
 252
 253
 254
 255
 256
 257
 258
 259
 260
 261
 262
 263
 264
 265
 266
 267
 268
 269
 270
 271
 272
 273
 274
 275
 276
 277
 278
 279
 280
 281
 282
 283
 284
 285
 286
 287
 288
 289
 290
 291
 292
 293
 294
 295
 296
 297
 298
 299
 300
 301
 302
 303
 304
 305
 306
 307
 308
 309
 310
 311
 312
 313
 314
 315
 316
 317
 318
 319
 320
 321
 322
 323
 324
 325
 326
 327
 328
 329
 330
 331
 332
 333
 334
 335
 336
 337
 338
 339
 340
 341
 342
 343
 344
 345
 346
 347
 348
 349
 350
 351
 352
 353
 354
 355
 356
 357
 358
 359
 360
 361
 362
 363
 364
 365
 366
 367
 368
 369
 370
 371
 372
 373
 374
 375
 376
 377
 378
 379
 380
 381
 382
 383
 384
 385
 386
 387
 388
 389
 390
 391
 392
 393
 394
 395
 396
 397
 398
 399
 400
 401
 402
 403
 404
 405
 406
 407
 408
 409
 410
 411
 412
 413
 414
 415
 416
 417
 418
 419
 420
 421
 422
 423
 424
 425
 426
 427
 428
 429
 430
 431
 432
 433
 434
 435
 436
 437
 438
 439
 440
 441
 442
 443
 444
 445
 446
 447
 448
 449
 450
 451
 452
 453
 454
 455
 456
 457
 458
 459
 460
 461
 462
 463
 464
 465
 466
 467
 468
 469
 470
 471
 472
 473
 474
 475
 476
 477
 478
 479
 480
 481
 482
 483
 484
 485
 486
 487
 488
 489
 490
 491
 492
 493
 494
 495
 496
 497
 498
 499
 500
 501
 502
 503
 504
 505
 506
 507
 508
 509
 510
 511
 512
 513
 514
 515
 516
 517
 518
 519
 520
 521
 522
 523
 524
 525
 526
 527
 528
 529
 530
 531
 532
 533
 534
 535
 536
 537
 538
 539
 540
 541
 542
 543
 544
 545
 546
 547
 548
 549
 550
 551
 552
 553
 554
 555
 556
 557
 558
 559
 560
 561
 562
 563
 564
 565
 566
 567
 568
 569
 570
 571
 572
 573
 574
 575
 576
 577
 578
 579
 580
 581
 582
 583
 584
 585
 586
 587
 588
 589
 590
 591
 592
 593
 594
 595
 596
 597
 598
 599
 600
 601
 602
 603
 604
 605
 606
 607
 608
 609
 610
 611
 612
 613
 614
 615
 616
 617
 618
 619
 620
 621
 622
 623
 624
 625
 626
 627
 628
 629
 630
 631
 632
 633
 634
 635
 636
 637
 638
 639
 640
 641
 642
 643
 644
 645
 646
 647
 648
 649
 650
 651
 652
 653
 654
 655
 656
 657
 658
 659
 660
 661
 662
 663
 664
 665
 666
 667
 668
 669
 670
 671
 672
 673
 674
 675
 676
 677
 678
 679
 680
 681
 682
 683
 684
 685
 686
 687
 688
 689
 690
 691
 692
 693
 694
 695
 696
 697
 698
 699
 700
 701
 702
 703
 704
 705
 706
 707
 708
 709
 710
 711
 712
 713
 714
 715
 716
 717
 718
 719
 720
 721
 722
 723
 724
 725
 726
 727
 728
 729
 730
 731
 732
 733
 734
 735
 736
 737
 738
 739
 740
 741
 742
 743
 744
 745
 746
 747
 748
 749
 750
 751
 752
 753
 754
 755
 756
 757
 758
 759
 760
 761
 762
 763
 764
 765
 766
 767
 768
 769
 770
 771
 772
 773
 774
 775
 776
 777
 778
 779
 780
 781
 782
 783
 784
 785
 786
 787
 788
 789
 790
 791
 792
 793
 794
 795
 796
 797
 798
 799
 800
 801
 802
 803
 804
 805
 806
 807
 808
 809
 810
 811
 812
 813
 814
 815
 816
 817
 818
 819
 820
 821
 822
 823
 824
 825
 826
 827
 828
 829
 830
 831
 832
 833
 834
 835
 836
 837
 838
 839
 840
 841
 842
 843
 844
 845
 846
 847
 848
 849
 850
 851
 852
 853
 854
 855
 856
 857
 858
 859
 860
 861
 862
 863
 864
 865
 866
 867
 868
 869
 870
 871
 872
 873
 874
 875
 876
 877
 878
 879
 880
 881
 882
 883
 884
 885
 886
 887
 888
 889
 890
 891
 892
 893
 894
 895
 896
 897
 898
 899
 900
 901
 902
 903
 904
 905
 906
 907
 908
 909
 910
 911
 912
 913
 914
 915
 916
 917
 918
 919
 920
 921
 922
 923
 924
 925
 926
 927
 928
 929
 930
 931
 932
 933
 934
 935
 936
 937
 938
 939
 940
 941
 942
 943
 944
 945
 946
 947
 948
 949
 950
 951
 952
 953
 954
 955
 956
 957
 958
 959
 960
 961
 962
 963
 964
 965
 966
 967
 968
 969
 970
 971
 972
 973
 974
 975
 976
 977
 978
 979
 980
 981
 982
 983
 984
 985
 986
 987
 988
 989
 990
 991
 992
 993
 994
 995
 996
 997
 998
 999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
/* -- pagc_api.h
This file is the common header file for PAGC internal routines
Prototype 20H10 (This file was written by Walter Sinclair).
Copyright (c) 2001-2012 Walter Bruce Sinclair
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/* For pagc-0.4.2 : last revised 2012-08-31 */
#ifndef PGC_H
#define PGC_H
#define BUILD_API
#include <postgres.h>
#ifdef DEBUG
#define DBG(format, arg...) \
elog(NOTICE, format , ## arg)
#else
#define DBG(format, arg...) do { ; } while (0)
#endif
#include "pagc_tools.h"
#ifndef BUILD_API
#include "pagc_common.h"
#ifdef MINGW32
#include <windows.h>
#endif
#ifdef ENABLE_THREADED
#ifdef HAVE_PTHREAD
#include <pthread.h>
#endif
#endif
#else
#define SENTINEL '\0'
#define BLANK_STRING(STR) *STR = SENTINEL
#define MAXSTRLEN 256
/* -- boolean -- */
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
#define ERR_FAIL -2
#define FAIL -1
#define BOTH 2
typedef int SYMB ;
typedef double DS_Score_t ;
typedef void * DS_Handle ;
#endif
#include <math.h>
#ifndef BUILD_API
#include "ds.h"
#define THREE_SOURCE_IDS
//#define WITH_ALT_LEFT_RIGHT
/* 2009-07-21 : keep track of version
2010-02-01 : increase to 0.3.0
2010-08-20 : increase to 0.4.0
2011-08-14 : increase to 0.4.1 */
#ifdef WITH_ALT_LEFT_RIGHT
#define CUR_PAGC_VER 41
#else
#define CUR_PAGC_VER 40
#endif
#endif
/* -- uncomment to index soundex-zip combo keys
#define COMBINE_POSTAL_WITH_SOUNDEX
-- */
#define USE_METERS
#define MAX_ATT_FLDS 4
#define MAX_REDIRECTS 6
#define COMMA ','
#define NEITHER 0
#define LEFT -1
#define RIGHT 1
#define OCCUPANCY_MULTIPLE 16
#define EXACT_MICRO_MATCH 32
#define EXACT_MACRO_MATCH 64
#define MACRO_THRESHOLD_MATCH 128
#define EPSILON 0
/* 2009-10-16 : increase size of MAXPHRASE and LANDMARK_ARRAY_WIDTH */
#define MAXPHRASE 10
#define LANDMARK_ARRAY_WIDTH 10 + MAXPHRASE
#define MAXFLDLEN MAXSTRLEN
#define MAX_REC_SPACE 262144
#define MAX_SCHEMAS 6 /* 2008-07-28 increased from 3 */
#define MAX_ERRORS 512
/* -- input symbols -- */
#define NUMBER 0
#define WORD 1
#define TYPE 2
#define ROAD 6
#define STOPWORD 7
#define DASH 9
#define AMPERS 13
#define ORD 15
#define SINGLE 18
#define BUILDH 19
#define MILE 20
#define DOUBLE 21
#define DIRECT 22
#define MIXED 23
#define BUILDT 24
#define FRACT 25
#define PCT 26
#define PCH 27
#define QUINT 28
#define QUAD 29
#define MAXINSYM QUAD + 1
/* -- output symbols -- */
#define BLDNG 0
#define HOUSE 1
#define PREDIR 2
#define QUALIF 3
#define PRETYP 4
#define STREET 5
#define SUFTYP 6
#define SUFDIR 7
#define RR 8
#define UNKNWN 9
#define CITY 10
#define PROV 11
#define NATION 12
#define POSTAL 13
#define BOXH 14
#define BOXT 15
#define UNITH 16
#define UNITT 17
#define MAXOUTSYM UNITT + 1
#define NEEDHEAD BOXH
/* 2009-07-19 : redefinitions in a landmarks context :
needed to collect from standardization output. */
#define FEATNAME 0
#define FEATTYPE 8
#define FEATAREA 9
#define FEAT_L 7
#define FEAT_T 8
#define FEAT_A 9
/* -- comparison types -- */
#define NO_COMPARISON 0
#define CHAR_SINGLE 1
#define POSTAL_SINGLE 2
#define NUMBER_SINGLE 3
#define CHAR_LEFT_RIGHT 4
#define POSTAL_LEFT_RIGHT 5
#define POSTAL_SPLIT 6
#define NUMBER_INTERVAL 7
#define NUMBER_INTERVAL_LEFT_RIGHT 8
#define POSTAL_LEFT_RIGHT_SPLIT 9
#define CHAR_ALT 10 /* 2008-07-30 : for alternate names */
#ifdef WITH_ALT_LEFT_RIGHT
#define CHAR_ALT_LEFT_RIGHT 11 /* 2008-07-30 : for alternate names */
#endif
#define ERR_READ -1
#define OK_READ 0
#define GOOD_READ 1
#define MAX_EDIT_DIST 2
#define US_FULL_CODE_LEN 10
#define US_PART_CODE_LEN 5
#define SXCODELEN 4
#define DEGREES_TO_RADIANS .0174532925199432958
#define DOUBLE_PI 6.2831853071795864769
#define PI 3.14159265358979323846
#define HALF_PI 1.57079632679489661923
#ifdef USE_METERS
#define EARTH_RADIUS 6378000.
#endif
#ifndef BUILD_API
/* FLAGS : 2009-07-19 : express as hexadecimal */
typedef unsigned int PAGC_FLAG_T ;
#define REVERSE_GEO 0x00000001u /* reserved for future use*/
/* pagc_common.h : #define STATISTICS 2 */
/* ds.h : #define HAVE_DBF_POSITION 0x00000004u */
#define ENABLE_PSEUDO 0x00000008u /* -- allows pseudo edit of reference -- FLPSEUD in schema -- */
#define ENABLE_CROSS 0x00000010u /* schema : XSTREET with fields */
#define ENABLE_ALT 0x00000020u /* reserved for future use*/
#define ENABLE_LAND 0x00000040u /* 2009-07-19 : denote presence of Feature Name field */
/* pagc_common.h : #define PRINT_PROGRESS 128 */
#define APPEND 0x00000100u /* -- internal flag for APPEND builds -- */
/* pagc_common.h :#define ZERO_IS_BLANK 512 */
#define HAVE_OCCUPANCY 0x00000400u /* schema : OCCUP1 or OCCUP2 with fields */
/* pagc_common.h :#define LOG_COMPLETE 2048 */
/* pagc_common.h :#define RNF_PRETYPE_REDIRECT 4096 */
#define CONCURRENT_PRIVATE 0x00002000u /* schema: FLCONPR -- deprecating */
#define NO_STOP_ON_EXACT 0x00004000u /* schema: FLNOSEX */
#define CAN_THREAD 0x00008000u
/* ds.h #define READ_POINTS_SEQUENTIAL 0x00010000u */
#define HAVE_OFFICIAL_STREET 0x00020000u /* schema : FLOFFST -- 2008-07-28 : new */
#define HAVE_SOURCE_ID 0x00040000u /* schema : SOURCEID with field */
#define HAVE_FEAT_TYPE 0x00080000u /* 2009-07-19 : denote presence of Feature Type field */
#define HAVE_SUBDISTRICT 0x00100000u /* 2009-07-19 : denote presence of Feature Area field */
#ifdef THREE_SOURCE_IDS
#define HAVE_SOURCE_ID_B 0x00200000u /* schema : SOURCEID_B with field */
#define HAVE_SOURCE_ID_C 0x00400000u /* schema : SOURCEID_C with field */
#endif
#endif
/* -- error records -- */
typedef struct err_rec
{
int is_fatal ; /* -- is this a fatal error ? -- */
char content_buf[MAXSTRLEN] ; /* -- storage for message -- */
} ERR_REC ;
typedef struct err_param
{
int last_err ;
int first_err ;
int next_fatal ;
ERR_REC err_array[MAX_ERRORS] ;
char *error_buf ;
FILE *stream ; /* -- stream for log file -- */
} ERR_PARAM ;
/*===================================================================
STANDARDIZATION
===================================================================*/
typedef int NODE ;
typedef int DEFDEF ;
#define MAXTEXT 31
#define FIRST_LEX_POS 0
#define RIGHT_COMPRESS STOPWORD
#define LEFT_COMPRESS WORD
/* -- weight names -- */
#define LOW 3
#define LOW_MEDIUM 6
#define MEDIUM 9
#define HIGH_MEDIUM 12
#define HIGH 15
#define EXCELLENT 16
#define PERFECT 17
#define NUMBER_OF_WEIGHTS PERFECT + 1
#define MAXDEF 8
#define MAX_STZ 6 /* <revision date='2012-06-03'>return to 6</revision> */
#define MAXMORPHS 64
#define MAXLEX 64
/* -- options for SendFields -- */
#define PSEUDO_XML 0
#define PSEUDO_CSV 1
#define SCREEN 2
#define NO_FORMAT 3
/* -- clause/class numbers -- */
#define MACRO_C 0
#define MICRO_C 1
#define ARC_C 2
#define CIVIC_C 3
#define EXTRA_C 4
#define MAX_CL 5
#define EXTRA_STATE 6
/* -- start_states -- */
#define MICRO_B 0
#define MICRO_M 1
#define MACRO 2
#define PREFIX 3
#define EXIT 4
/* -- tokens --
used in tokenize.c -- */
#define DFRACT 0
#define DSINGLE 1
#define DDOUBLE 2
/* -- changed so not to conflict with Windows def --*/
#define DWORDT 3
#define DNUMBER 4
#define DMIXED 5
#define DPOSTH 6
#define DPOSTT 7
#define DZIPH 8
#define DZIPT 9
#define DDIRLET 10
#define DORD 11
#define DUNIT 12
/* ================= standardization records ===================*/
/* -- This structure stores a definition for a lexical entry -- */
typedef struct def
{
int Order ; /* -- the order in the list -- */
SYMB Type ; /* -- the Input symbol -- */
int Protect ;
char *Standard ; /* -- The standardization -- */
struct def *Next ;
} DEF ;
/* -- This stores the data for a lexical entry -- */
typedef struct entry
{
char *Lookup ; /* -- To match against the input word -- */
DEF *DefList ; /* -- list of definitions and outputs for this word -- */
struct entry *Next ;
} ENTRY ;
/* -- storage for standardization rules -- */
typedef struct keyword
{
SYMB *Input ; /* -- List of input symbols -- */
SYMB *Output ; /* -- List of output symbols, 1-1 with input -- */
SYMB Type ; /* -- The classification of the rule -- */
SYMB Weight ;
int Length ; /* -- The number of symbols -- */
int hits ; /* -- if collecting statistics -- */
int best ; /* -- if collecting statistics -- */
struct keyword *OutputNext ;
} KW ;
typedef struct lexeme
{
int StartMorph ;
int EndMorph ;
DEF *DefList ;
char Text[MAXTEXT] ;
} LEXEME ;
/* 2006-11-02 */
typedef struct rule_param
{
int num_nodes ;
int rules_read ;
int collect_statistics ;
int total_key_hits ;
int total_best_keys ;
NODE **gamma_matrix;
SYMB *rule_space ;
KW ***output_link ;
KW *key_space ;
} RULE_PARAM ;
/* -- structure used to assemble composite output -- */
typedef struct seg
{
SYMB sub_sym ; /* -- Used in forced standardization -- */
int Start ; /* -- the start target position -- */
int End ; /* -- the end position -- */
int State ; /* -- row number of the tran table, used in clausetree -- */
DS_Score_t Value ; /* -- the calculated value of the target segment -- */
SYMB *Output ; /* -- the output copied from the rule -- */
KW *Key ; /* -- the rule itself, used in clausetree construction -- */
} SEG ;
/* -- storage structure for standardization candidates -- */
typedef struct stz
{
DS_Score_t score ; /* -- standardization score -- */
DS_Score_t raw_score ;
KW *build_key ; /* -- use to collect statistics -- */
DEF *definitions[MAXLEX] ; /* -- lexical or input definitions -- */
SYMB output[MAXLEX] ; /* -- output tokens -- */
} STZ ;
/* 2006-11-02 */
typedef struct stz_param
{
int stz_list_size ;
int last_stz_output ;
double stz_list_cutoff ;
SEG *segs ;
STZ **stz_array ;
} STZ_PARAM ;
/* 2006-11-14 */
struct morph
{
int Term ;
int TextLen ;
char Text[MAXTEXT] ;
DEFDEF Sym ;
} ;
typedef struct stand_param
{
int cur_morph ;
int base_morph ;
int LexNum ;
int analyze_complete ;
int *have_ref_att ; /* build.c (transform_rows) */
RULE_PARAM *rules ;
/*-- <remarks> 2009-08-13 : support multiple lexicons </remarks> --*/
ENTRY **lexicon ;
ENTRY **address_lexicon ;
ENTRY **poi_lexicon ;
/*-- <revision date='2012-06-01'> Add gaz_lexicon to be triggered on __start_state__ = MACRO </revision> --*/
ENTRY **gaz_lexicon ;
/*-- <revision date='2012-07-22'> Keep track of start_state </revision> --*/
int start_state ;
ERR_PARAM *errors ;
STZ_PARAM *stz_info ; /* structure created by analyze.c (create_segments) */
DEF **default_def ;
char **standard_fields ;
struct morph morph_array[MAXMORPHS] ;
SYMB best_output[MAXLEX] ;
SYMB target[MAXLEX] ; /* -- target for Aho-Corasick -- */
LEXEME lex_vector[MAXLEX] ;
int cur_sym_sel[MAXLEX] ; /* -- currently selected symbol
for each lexeme -- */
int orig_str_pos[MAXLEX] ; /* -- compression buffer -- */
int def_cnt[MAXLEX] ; /* -- number of symbols for each lexeme -- */
NODE registry[MAXLEX + 1] ; /* -- Aho-Corasick : offsets to output
links -- */
DEF *best_defs[MAXLEX] ;
DEF *def_array[MAXLEX][MAXDEF] ; /* -- the definitions for each
lexeme -- */
SYMB comp_lex_sym[MAXLEX][MAXDEF] ; /* -- symbols for each lexeme -- */
} STAND_PARAM ;
/* ================ NON-STANDARDIZATION RECORDS ================== */
#ifndef BUILD_API
/* -- The attribute structure is used to coordinate the schema in the
reference data with the postal attributes identified by the standardizer
and which may be used in the user's addresses. -- */
typedef struct attribute
{
SYMB symbol ;
int comp_type ; /* -- The comparision type used in matching -- */
int check_dir ; /* -- TRUE if a non-blank reference field is read -- */
int num_redirects ;
DS_Score_t m_weight ; /* -- matching weights -- */
DS_Score_t u_weight ;
DS_Field_t ru_fld_idx[MAX_ATT_FLDS] ; /* -- field index for unstandardized
ref table -- */
DS_Field_t rs_fld_idx[MAX_ATT_FLDS] ; /* -- field index for standardized
ref table -- */
DS_Field_t rs_off_fld_idx[MAX_ATT_FLDS] ; /* field index for official names in
standardized ref table -- 2009-11-21 */
SYMB redirects[MAX_REDIRECTS] ; /* -- reference fields to which this
attribute should be redirected -- */
} ATTRIBUTE ;
/* --------------------------------------------------------------
This structure is used to store the information on each reference
record with which we attempt to match the user record
---------------------------------------------------------------- */
typedef struct candidate
{
int score_card ; /*2008-12-15*/
DS_Entity_t record ; /* -- reference database record number -- */
int stz ; /* -- The standardization being used -- */
int edit_distance ; /* -- for use in matching -- */
DS_Score_t score ; /* -- score calculated in ReadScoreStandardized -- */
PAGC_POINT position ;
int block_face ;
char data[BETA_BUF_SIZE] ; /* -- data for display to user - added in
betaref.c (ReadScoreStandardized) -- */
} CANDIDATE ; /* -- structure initialized in Index/CreateCandidate --*/
typedef struct int_candidate
{
DS_Entity_t record_A ;
DS_Entity_t record_B ;
int edit_distance_A ;
int edit_distance_B ;
DS_Score_t score ;
PAGC_POINT position ;
int stz_A ;
int stz_B ;
char cur_cand_data_A[BETA_BUF_SIZE] ;
char cur_cand_data_B[BETA_BUF_SIZE] ;
} INT_CANDIDATE ;
#endif
/* ================== global record =================== */
typedef struct pagc_global
{
int log_init ;
RULE_PARAM *rules ;
DEF **default_def ;
/*-- <revision date='2009-08-13'> Support multiple lexicons </revision> --*/
ENTRY **addr_lexicon ; /*-- 2006-11-20 --*/
ENTRY **poi_lexicon ;
/*-- <revision date='2012-07-16'> gaz_lexicon </revision> --*/
ENTRY **gaz_lexicon ;
DS_Handle _file_sys ;
ERR_PARAM *process_errors ;
} PAGC_GLOBAL ;
#ifndef BUILD_API
/* <revision date='2012-04-26'>Divert approx functions to TRIE_ARRAY -- moved approx definitions to approx.c </revision>*/
typedef void * RECOGNIZER_HANDLE ;
/* ============================ main schema record ========================== */
typedef struct schema
{
DS_Score_t match_weight[MAXOUTSYM] ; /* match weight for each token employed in the schema */
DS_Score_t unmatch_weight[MAXOUTSYM] ; /* the non-match weight for each */
DS_Score_t max_score ; /* the maximum score for address matching */
DS_Score_t score_range ; /* used in normalizing scores for addresses */
DS_Score_t starting_cutoff ; /* initial cutoff for candidate elimination */
DS_Score_t user_cut ; /* client-supplied cutoff */
/*-- intersection scoring --*/
DS_Score_t max_x_score ; /* the maximum for intersection matching */
DS_Score_t max_m_weight ; /* used in intersection scoring for the cross street */
DS_Score_t max_u_weight ; /* used in intersection scoring for the cross street */
DS_Score_t x_m_weight ; /* used in intersection scoring for the cross street */
DS_Score_t x_u_weight ; /* used in intersection scoring for the cross street */
DS_Score_t x_range ; /* used for normalizing intersection scores */
/*-- <revision date='2009-08-20'> Landmark scoring. </revision> --*/
DS_Score_t max_p_score ; /* the maximum for landmark matching */
DS_Score_t land_words_m_weight ; /* for landmark fields */
DS_Score_t land_words_u_weight ; /* for landmark fields */
DS_Score_t land_type_m_weight ; /* for landmark fields */
DS_Score_t land_type_u_weight ; /* for landmark fields */
DS_Score_t land_area_m_weight ; /* for landmark fields */
DS_Score_t land_area_u_weight ; /* for landmark fields */
DS_Score_t score_p_range ; /* landmark score normalization */
DS_Metric_t lat_units ; /* size in meters of a degree of latitude */
DS_Metric_t lon_units ; /* size in meters of a degree of longitude */
DS_Coord_t MBR_max_X ; /* Minimal Bounding Rectangle maximum point X coordinate */
DS_Coord_t MBR_max_Y ; /* MBR maximum point Y coordinate */
DS_Coord_t MBR_min_X ; /* Minimum point X */
DS_Coord_t MBR_min_Y ; /* Minimum point Y */
int pagc_ver ; /*-- <revision date='2009-07-21'> Tracking version. </revision> --*/
DS_Dim_t shp_typ ; /* Shape type in shapefile - point, arc */
int both_sides ; /* do arcs have both sides, ie both left and right? -- used for SITE_INTERPOLATE */
DS_Field_t from_cross_col ; /* the from cross street in the reference shapeset (for intersections) */
DS_Field_t to_cross_col ; /* the to cross street for intersections */
DS_Field_t alt_street_col ; /* alternate name column in reference shapeset - for future use */
/*-- landmark columns --*/
int total_landmark_words ; /*-- <revision date='2009-07-26'/> --*/
DS_Field_t landmark_alpha ; /*-- <revision date='2009-07-19-21'> landmark columns </revision> --*/
DS_Field_t landmark_beta ;
DS_Field_t landmark_beta_official ;
DS_Field_t landmark_type_alpha ; /*-- <revision date='2009-07-19'> new </revision> --*/
DS_Field_t landmark_type_beta ;
DS_Field_t subdistrict_alpha ; /*-- <revision date='2009-07-19'> new </revision> --*/
DS_Field_t subdistrict_beta ;
DS_Field_t occ_field1 ; /* -- if HAVE_OCCUPANCY -- */
DS_Field_t occ_field2 ; /* -- if HAVE_OCCUPANCY -- */
/*-- <revision date='2010-09-27'> Eliminate X_field and Y_field for HAVE_DBF_POSITION
and use following: </revision> --*/
DS_Geo_t typ_geo_cols ;
DS_Field_t num_geo_cols ;
DS_Field_t geo_cols[3] ;
/*-- DS_Field_t X_field ; DS_Field_t Y_field ; --*/
DS_Field_t num_official_fields ; /* if HAVE_OFFICIAL_STREET, state the number of fields */
DS_Field_t source_id_alpha ; /* if HAVE_SOURCE_ID, dbf field 2008-17-17 */
DS_Field_t source_id_beta ; /* if HAVE_SOURCE_ID, standard field 2008-17-17 */
#ifdef THREE_SOURCE_IDS
DS_Field_t source_id_alpha_b ; /* if HAVE_SOURCE_ID_B, dbf field 2008-17-17 */
DS_Field_t source_id_beta_b ; /* if HAVE_SOURCE_ID_B, standard field 2008-17-17 */
DS_Field_t source_id_alpha_c ; /* if HAVE_SOURCE_ID_C, dbf field 2008-17-17 */
DS_Field_t source_id_beta_c ; /* if HAVE_SOURCE_ID_C, standard field 2008-17-17 */
#endif
int num_atts ; /* how many address attributes */
int have_micros ;
int have_macros ; /* does schema have place state zip attributes? */
int have_postal ; /* does it have, specifically, a postal attribute ? */
DS_Entity_t last_number ; /* last record number for beta reference */
int RedirectDir ; /* determine if a redirect of directional attribute is required */
int RedirectTyp ; /* determine if a redirect of a street type attribute is required */
int RedirectQual ; /* determine if a redirect of a qualifier attribute is required */
DS_Field_t number_of_beta_fields ;
int variants ; /* how many appends have been made */
int beta_insert ; /* are we in read or write mode */
int little_endian ; /* is it little or big? */
int q_depth ; /* granularity for reverse geocoding */
PAGC_FLAG_T flags ; /* bit flags indicating what features are enabled for this schema */
ATTRIBUTE attributes[MAXOUTSYM] ; /* array for address attributes */
ATTRIBUTE *last_att ; /* address of the last attribute */
ATTRIBUTE *attribute_index[MAXOUTSYM] ; /* an index into the attributes by token */
#ifdef USE_DITTO_FIELD
/*-- <revision date='2008-05-08'> Allocated field to store last postal code read. </revision> --*/
char *ditto_field ;
#endif
char *idx_nam[ MAX_INDICES ] ; /* pointers to allocated index names */
char *beta_table_name ;
DS_Handle _beta_factory ;
/*-- <revision date='2012-03-27'> Remove pool handles and replace with RECOGNIZER_HANDLES </revision> --*/
RECOGNIZER_HANDLE street_postal_trie ; /*-- <revision date='2012-03-27'>change type</revision> --*/
RECOGNIZER_HANDLE concat_trie ;
RECOGNIZER_HANDLE landmark_name_trie ;
} SCHEMA ;
/* ===================== build database control record ============= */
typedef struct bdb_build_param
{
ERR_PARAM *errors ;
SCHEMA *schema ;
DS_Handle _beta_attribute_interface ;
DS_Handle _idx_db[MAX_INDICES] ;
DS_Byte_t *shape_buf ;
} BDB_BUILD_PARAM ;
/* ============ structures for intersection search =========== */
typedef struct x_cand
{
DS_Entity_t beta_rec ;
int reversed ;
int strategy ;
int stz_num ;
int distance ;
DS_Coord_t X ;
DS_Coord_t Y ;
struct x_cand *cluster ;
} X_CAND ;
typedef struct pair_read
{
DS_Entity_t record_1 ;
DS_Entity_t record_2 ;
struct pair_read *next ;
} PAIR_READ ;
typedef struct box_cell
{
X_CAND *splitter ;
PAIR_READ *pair_list ;
struct box_cell *cell_list[4] ;
} BOX_CELL ;
/* ============== structure for recording beta records read ======== */
typedef struct record_read
{
DS_Entity_t row_no ;
int stz ;
struct record_read * left ;
struct record_read * right ;
} RECORD_READ ;
typedef struct r_r_mgr
{
int current_offset ;
void *base ; /* 2010-06-24 : change to void * for flexibility */
struct r_r_mgr *prev_block ;
struct r_r_mgr *next_block ;
} R_R_MGR ;
/* 2011-01-24 : keep schema linkages on hand until closure */
typedef struct schema_db_linkage
{
SCHEMA * linked_schema ;
DS_Handle _linked_beta ;
DS_Handle _linked_idx[MAX_INDICES] ;
} SCHEMA_DB_LINKAGE ;
/* ============ main matching context record ========== */
typedef struct pagc_context
{
SCHEMA *schema ;
ERR_PARAM *errors ;
int num_backlinks ; /* 2011-01-24 : keep schema linkages on hand until closure */
SCHEMA_DB_LINKAGE * schema_backlinks[MAX_SCHEMAS] ; /* 2011-01-24 */
DS_Handle _beta_attribute_interface ;
DS_Handle _idx_db[MAX_INDICES] ; /* reader handles */
int private_errs ;
int numb_cands ;
DS_Entity_t matched_ref_row ;
DS_Entity_t matched_ref_row_B ;
int strategy ;
int next_free ;
int query_begin ;
int concat_reverse ; /* use for intersection concat keys */
int collect_all ;
INT_CANDIDATE ** int_cand_list ;
char **street_words ;
char **landmark_words ; /* 2009-09-17 */
CANDIDATE **cand_list ;
/* int numb_x_cands ; 2010-06-26, no longer needed */
/* X_CAND *x_cand_list ; 2010-06-26, no longer needed */
STAND_PARAM *standard_p ;
STAND_PARAM *standard_p_B ;
double seg_length[DS_MAX_VERTICES] ;
DS_Score_t cand_list_cutoff ;
DS_Score_t intersection_cutoff ;
R_R_MGR *r_r ; /* -- allocated memory -- */
R_R_MGR *pair_r_r ; /* 2010-06-26 new structure */
R_R_MGR *box_r_r ; /* 2010-06-26 new structure */
R_R_MGR *x_cand_r_r ; /* 2010-06-26 new structure */
RECORD_READ **rec_hash_tab ; /* -- allocated memory -- */
DS_Byte_t *shape_buf ;
char transfer_buf[MAX_TRANSFER_BUF_SIZE] ;
/* PAIR_READ *pair_buf ; 2010-06-26, no longer needed */
BOX_CELL **overlap_buf ; /* -- allocated memory -- */
BOX_CELL *box_root ;
/* BOX_CELL *box_cell_array ; 2010-06-26, no longer needed */
/* int num_box_cells ; 2010-06-26, no longer needed */
} PAGC_CONTEXT ;
/* =============== client interface record (not exposed) =========== */
typedef struct client_handle
{
int handle_check ;
int num_contexts ;
int num_schemas ;
PAGC_GLOBAL *global_record ;
FILE *misc_aux_stream ;
STAND_PARAM *misc_stand ;
PAGC_CONTEXT *context_records[MAX_CONTEXTS] ;
SCHEMA *schema_records[MAX_SCHEMAS] ;
} CLIENT_HANDLE ;
/* 2009-07-27 : structure for landmark scoring */
typedef struct cand_score_params
{
int target_word_cnt ;
int postal_idx ; /* which requester field has the postal */
int city_idx ;
int prov_idx ;
int type_idx ;
int subdistrict_idx ;
int soundex_approx ;
char **words_buf ;
DS_Score_t *word_weights ; /* 2009-11-20 */
} CAND_SCORE_PARAMS ;
/*-- <revision date='2012-08-20'> New definition </revision> --*/
typedef struct check_macro
{
int in_line_string ;
SYMB last_checked ;
int __primary_in_reference__[4] ; // Each reference present marks this
int __secondary_in_reference__[4] ;
int action_alt_left ;
#ifdef WITH_ALT_LEFT_RIGHT
int action_alt_right ;
#endif
char __field_primary__[4][MAXSTRLEN] ;
char __field_secondary__[4][MAXSTRLEN];
char __field_alternate_primary__[4][MAXSTRLEN];
char __field_alternate_secondary__[4][MAXSTRLEN];
char __unstandard_left__[MAXSTRLEN] ;
char __unstandard_right__[MAXSTRLEN] ;
char __unstandard_alt_left__[MAXSTRLEN] ;
char __unstandard_alt_right__[MAXSTRLEN] ;
/*-- <remarks> These should be in the lexicon consulted for MACRO </remarks> --*/
const char __dummies__[4][6] ;
} CHECK_MACRO ;
/* ===================== prototypes for functions ================ */
/* -- approx.c -- */
/*-- <revision date='2012-04-26'>Divert approx functions to TRIE_ARRAY</revision> --*/
RECOGNIZER_HANDLE _new_recognizer_(DS_Handle, DS_Index_Link , int, int, const char *, int, ERR_PARAM *);
void _free_recognizer_(RECOGNIZER_HANDLE);
int _insert_recognizer_key_(RECOGNIZER_HANDLE, char *, char *) ;
int _recognize_approx_(RECOGNIZER_HANDLE, PAGC_CONTEXT *, char *, char *, int, char **, int , int , CAND_SCORE_PARAMS *) ;
#endif
/* -- standard.c -- */
int standardize_field(STAND_PARAM *, char *, int) ;
void close_stand_context(STAND_PARAM *) ;
STAND_PARAM *init_stand_context(PAGC_GLOBAL *, ERR_PARAM *, int) ;
void close_stand_process(PAGC_GLOBAL *) ;
/* 2009-08-13 : support multiple lexicons */
int init_stand_process(PAGC_GLOBAL *, const char *, const char *, const char *, const char *) ;
/* -- tokenize.c -- */
void initialize_morphs(STAND_PARAM *) ;
int setup_default_defs(PAGC_GLOBAL *) ;
void remove_default_defs(PAGC_GLOBAL *) ;
int process_input(STAND_PARAM *) ;
int new_morph(STAND_PARAM *, DEFDEF, const char *, int) ;
void set_term(STAND_PARAM *, int, const char *);
int is_symb_on_list(SYMB, SYMB *) ;
int find_def_type(DEF *, SYMB *) ;
/* -- export.c -- */
void stuff_fields(STAND_PARAM *) ;
void init_output_fields(STAND_PARAM *, int) ;
int sym_to_field(SYMB) ;
void send_fields_to_stream(char **, FILE *, int, int) ;
/* -- analyze.c -- */
int install_def_block_table(ENTRY **, ERR_PARAM *) ;
STZ_PARAM *create_segments(ERR_PARAM *) ;
void destroy_segments(STZ_PARAM *) ;
int get_next_stz(STAND_PARAM *, int) ;
double get_stz_downgrade(STAND_PARAM *, int) ;
/*-- <revision date='2012-07-22'> Keep track of start_state </revision> --*/
int evaluator(STAND_PARAM *) ;
void output_raw_elements(STAND_PARAM *,ERR_PARAM *) ;
/* -- gamma.c -- */
void refresh_transducer(NODE *, SYMB *, NODE **) ;
int is_input_symbol(SYMB) ;
int is_output_symbol(SYMB) ;
RULE_PARAM *create_rules(const char *, PAGC_GLOBAL *) ;
void destroy_rules(RULE_PARAM *) ;
#ifdef BUILD_API
int output_rule_statistics(RULE_PARAM *, ERR_PARAM *) ;
#else
int output_rule_statistics(RULE_PARAM *, ERR_PARAM *, char *, DS_Handle) ;
#endif
/* -- lexicon.c -- */
ENTRY **create_lexicon(PAGC_GLOBAL *, const char *, const char *) ;
void destroy_lexicon(ENTRY **) ;
void destroy_def_list(DEF *) ;
ENTRY *find_entry(ENTRY **, char *) ;
DEF *create_def (SYMB, char *, int, int, ERR_PARAM *) ;
/* -- err_param.c -- */
ERR_PARAM *init_errors(PAGC_GLOBAL *, const char *) ;
void close_errors(ERR_PARAM *) ;
int empty_errors(ERR_PARAM *, int *, char *) ;
void register_error(ERR_PARAM *) ;
void send_fields_to_error(ERR_PARAM *, char **) ;
/* -- util.c -- */
FILE *open_aux_file(PAGC_GLOBAL *, const char *) ;
#ifndef BUILD_API
/* -- candform.c -- */
int sads_format_standard_fields(STAND_PARAM *, int, char *) ;
void fetch_standard_headers(char *) ;
/* 2008-07-21 sads_format_candidate : add is_parity_mismatch argument,
add source_identifier argument */
#ifdef THREE_SOURCE_IDS
int sads_format_candidate(PAGC_CONTEXT *, DS_Entity_t, int, char *, int, int, int, int *, char *, char *, char *) ;
#else
int sads_format_candidate(PAGC_CONTEXT *, DS_Entity_t, int, char *, int, int, int, int *, char *) ;
#endif
void cand_header_list(PAGC_CONTEXT *, int, char * ) ;
/* 2008-07-28 ols_format_candidate : new routine */
int ols_format_candidate(PAGC_CONTEXT *, DS_Entity_t, int, char *, char *, int, int, int *) ;
/* -- init.c -- */
/* 2009-08-13 : support multiple lexicons */
PAGC_GLOBAL *init_global(int, const char *, const char *, const char *, const char *, const char *, const char *) ;
void close_global(PAGC_GLOBAL *) ;
SCHEMA *init_schema(ERR_PARAM *) ;
int close_schema(SCHEMA *, ERR_PARAM *) ; /* 2011-01-22 : return error code */
PAGC_CONTEXT *init_context(PAGC_GLOBAL *, SCHEMA *, ERR_PARAM *, int, const char *) ;
void close_context(PAGC_CONTEXT *) ;
/* -- build.c -- */
int build_beta(PAGC_GLOBAL *, SCHEMA *, ERR_PARAM *, DS_Handle, DS_Handle, BDB_BUILD_PARAM *, char *, char *, DS_Entity_t, DS_Entity_t) ;
/* -- collect.c -- */
int match_address(PAGC_CONTEXT *, char *, char *, int, int) ;
int match_landmark(PAGC_CONTEXT *, char *, char *, char *, char *, int) ;
/* 2008-12-15 : add int arg to save_candidate */
int save_candidate(PAGC_CONTEXT *, DS_Entity_t, int, DS_Score_t, int, int, char *) ;
int match_intersection( PAGC_CONTEXT *, char *, char *, char *, char *, int) ;
int save_intersection_candidate(PAGC_CONTEXT *, DS_Entity_t, DS_Entity_t, int, int, int, int, DS_Score_t, DS_Coord_t, DS_Coord_t) ;
/* -- geocode.c -- */
DS_Entity_t locate_incident_arcs(PAGC_CONTEXT *, DS_Entity_t, int, int) ;
DS_Score_t score_arc_direction(PAGC_CONTEXT *, DS_Entity_t, PAGC_POINT *, DS_Angular_t) ;
int geocode_address_candidate(PAGC_CONTEXT *, PAGC_POINT *, int, int *, DS_Metric_t) ;
int geocode_intersection_candidate(PAGC_CONTEXT *, PAGC_POINT *, int) ;
int geocode_landmark_candidate(PAGC_CONTEXT *, PAGC_POINT *, int) ;
DS_Metric_t pyth_dist2(SCHEMA *, DS_Coord_t *, DS_Coord_t *, DS_Coord_t *, DS_Coord_t *) ;
DS_Metric_t degree_dist(DS_Metric_t, DS_Coord_t, DS_Coord_t) ;
int collect_incident_arcs(PAGC_CONTEXT *, int, int, int) ;
/* -- score.c -- */
int read_score_stand(PAGC_CONTEXT *, DS_Score_t *, char **, DS_Entity_t, int, int *) ;
int read_score_stand_land( PAGC_CONTEXT *, DS_Score_t *, char **, DS_Entity_t, int *, CAND_SCORE_PARAMS *) ;
int resolve_range_direction(int *, int *, int, int, int, int) ;
DS_Score_t interpolate_weight(DS_Score_t, DS_Score_t, DS_Score_t) ;
int match_number_interval_left_right(int, int, int, int, int, int) ;
DS_Score_t normalize_score(SCHEMA *, DS_Score_t) ;
DS_Score_t normalize_landmark_score(SCHEMA *, DS_Score_t) ;
DS_Score_t max_context_score(PAGC_CONTEXT *) ;
/* -- make_sch.c -- */
void get_weight_pair(SCHEMA *, ATTRIBUTE *) ;
int build_ref_schema(SCHEMA * , DS_Handle, ERR_PARAM *, DS_Handle, const char *, PAGC_FLAG_T) ;
ATTRIBUTE *get_att_by_symbol(SCHEMA *, SYMB) ;
int is_official(SCHEMA *, SYMB) ; /* 2009-11-23 : new function */
/* -- restore.c -- */
int restore_build_state(PAGC_GLOBAL *, SCHEMA *, const char *, int) ;
int save_build_state(SCHEMA * , const char *, ERR_PARAM *, DS_Handle) ;
/* -- shapeset.c -- */
int open_alpha_for_build(DS_Handle *, DS_Handle *, DS_Handle *, DS_Handle , const char *, const char *, char **, ERR_PARAM *) ;
void close_alpha(DS_Handle *, DS_Handle *, DS_Handle *, ERR_PARAM *) ;
int open_positioning(SCHEMA *, DS_Handle *, char *, DS_Handle, ERR_PARAM *) ;
void set_feature_shape_type(SCHEMA *) ;
int set_matching_units(SCHEMA *) ;
void update_mbr(SCHEMA *, DS_Handle) ;
/* -- index.c -- */
BDB_BUILD_PARAM * open_build_db(SCHEMA *, ERR_PARAM *) ;
void close_build_db(BDB_BUILD_PARAM *) ;
int open_context_db(PAGC_CONTEXT *, SCHEMA *, ERR_PARAM *) ;
void close_context_db(PAGC_CONTEXT *) ;
int open_schema_db(SCHEMA *, ERR_PARAM *, DS_Handle, const char *, int) ;
int close_schema_db(SCHEMA *, ERR_PARAM *) ;
int create_schema_indices(SCHEMA *, ERR_PARAM *) ;
int open_index(SCHEMA *, ERR_PARAM *, DS_Index_Link, int) ;
/* -- indexput.c -- */
/* <revision date='2012-03-27'>new args for insert_key and insert_concat_key */
int insert_key(BDB_BUILD_PARAM *, DS_Index_Link, char *, DS_Entity_t, char *) ;
int insert_concat_key(BDB_BUILD_PARAM *, DS_Index_Link,char *, DS_Entity_t, int, PAGC_POINT *, char *) ;
int insert_attribute_point(SCHEMA *, BDB_BUILD_PARAM *, DS_Handle, DS_Entity_t, DS_Entity_t, ERR_PARAM *) ;
int insert_shape(SCHEMA *, BDB_BUILD_PARAM *, DS_Handle, DS_Entity_t, DS_Entity_t, ERR_PARAM *err_p, PAGC_POINT *, PAGC_POINT * ) ;
/* -- indexget.c -- */
int fetch_shape(PAGC_CONTEXT *, DS_Entity_t, int *, DS_Coord_t **, DS_Coord_t **) ;
int register_candidate(PAGC_CONTEXT *, char **, DS_Index_Link, int, char *, int, CAND_SCORE_PARAMS *) ;
int read_arc_endpoints(PAGC_CONTEXT *, DS_Entity_t, PAGC_POINT *, PAGC_POINT *) ;
DS_Entity_t find_arcs_by_point(PAGC_CONTEXT *, DS_Entity_t, PAGC_POINT *, DS_Angular_t) ;
int print_beta_text(PAGC_CONTEXT *) ;
int print_index_text(PAGC_CONTEXT *, DS_Index_Link) ;
int print_shape_index(PAGC_CONTEXT *, DS_Index_Link) ;
int calc_landmark_word_weights(PAGC_CONTEXT *, int, int *, DS_Score_t *) ;
/* -- alpharef.c -- */
int read_alpha_house(DS_Handle, DS_Entity_t, DS_Field_t, int) ;
int extract_house(const char *, int) ;
/* 2008-07-30 : add unstandard_mac_alternate arg and flag for alternate city names
2009-11-23 : add arrays for official name fields */
/*-- <revision date='2012-08-30'> Use check_macro </revision> --*/
int read_unstandardized(SCHEMA *, DS_Handle, DS_Entity_t, int *, int *, int *, char *, CHECK_MACRO* , char *, char **, DS_Field_t *, int *, ERR_PARAM *) ;
/* -- makebeta.c -- */
int init_standardized_table(SCHEMA *, ERR_PARAM *) ;
int soundex_street_words(char *, char **) ;
/* 2008-08-01 : add stand_alt_macro flag for alternate city names */
/*-- <revision date='2012-08-30'> Use check_macro </revision> --*/
int write_standardized(SCHEMA *, BDB_BUILD_PARAM *, char **, char **, CHECK_MACRO *, int, int *, char *, char *, char *, DS_Entity_t, int) ;
void do_left_saves(char **, char *, char *, char *, int) ;
int index_cross_streets(SCHEMA *, BDB_BUILD_PARAM *, char **, char **, DS_Handle, DS_Entity_t, DS_Entity_t, STAND_PARAM *, PAGC_POINT *, PAGC_POINT *, ERR_PARAM *) ;
int write_occupancy_only(SCHEMA *, DS_Handle, char **, DS_Entity_t) ;
/* 2008-08-01 : new routine to standardize alternate city names */
#ifdef WITH_ALT_LEFT_RIGHT
int write_alt_macro_only(SCHEMA *, DS_Handle, char **, int, DS_Entity_t) ;
#else
int write_alt_macro_only(SCHEMA *, DS_Handle , char **, DS_Entity_t) ;
#endif
/* 2009-07-22 : new routines to standardize and write landmark names */
int write_landmark_name_only(SCHEMA *, BDB_BUILD_PARAM *, char **, char **, char **, DS_Entity_t, ERR_PARAM *) ;
int tokenize_landmark_words(char *, char **) ;
#endif
/* ============================ MACROS ========================== */
#define IS_BLANK( STR ) *STR == SENTINEL
#define SPACE 0x20
/* ================ ERROR MACROS ==================== */
#define LOG_DS_ERR( INTF, WHERE ) \
ds_copy_error( INTF , WHERE -> error_buf ) ; \
register_error( WHERE )
#define TERMINATE_INTERFACE( STATUS_REG_V , INTF , WHERE ) \
STATUS_REG_V = ds_terminate( INTF ) ; \
if ( STATUS_REG_V != DS_OK ) { \
LOG_DS_ERR( INTF, WHERE ) ; \
} \
ds_dispose_interface( INTF )
#define LOG_MESS(STR,WHERE) \
sprintf( WHERE -> error_buf , \
STR ) ; \
register_error( WHERE )
#define LOG_MESS1( TEMP,INSERT,WHERE) \
sprintf( WHERE -> error_buf , \
TEMP, \
INSERT ) ; \
register_error( WHERE )
#define LOG_MESS2( TEMP,INSERT1,INSERT2,WHERE ) \
sprintf( WHERE -> error_buf , \
TEMP, \
INSERT1, \
INSERT2 ) ; \
register_error( WHERE )
#define LOG_MESS3( TEMP,INSERT1,INSERT2,INSERT3,WHERE ) \
sprintf( WHERE -> error_buf , \
TEMP, \
INSERT1, \
INSERT2 , \
INSERT3 ) ; \
register_error( WHERE )
#define RET_ERR(STR,WHERE,RET) \
LOG_MESS(STR,WHERE) ; \
return RET
#define RET_ERR1(TEMP,INSERT,WHERE,RET) \
LOG_MESS1(TEMP,INSERT,WHERE) ; \
return RET
#define RET_ERR2(TEMP,INSERT1,INSERT2,WHERE,RET) \
LOG_MESS2(TEMP,INSERT1,INSERT2,WHERE) ; \
return RET
#define RET_ERR3(TEMP,INSERT1,INSERT2,INSERT3,WHERE,RET) \
LOG_MESS3(TEMP,INSERT1,INSERT2,INSERT3,WHERE) ; \
return RET
#define FATAL_EXIT exit(1)
#define FATAL_ERR( MSG ) \
fprintf( stderr , MSG ) ; \
FATAL_EXIT
#define CLIENT_ERR( PTR ) PTR -> next_fatal = FALSE
#define MEM_ERR(PTR,WHERE,RET) \
if ( PTR == NULL ) {\
RET_ERR("Insufficient Memory",WHERE,RET) ; \
}
/* ----------- ALLOCATION MACROS ----------- */
#define PAGC_STORE_STR(DEST,SRC,WHERE,RET_VAL) \
DEST = (char * ) malloc( sizeof( char ) * ( strlen( SRC ) + 1 ) ) ; \
MEM_ERR(DEST,WHERE,RET_VAL) ; \
BLANK_STRING(DEST) ; \
strcpy(DEST,SRC)
#define PAGC_ALLOC_STRUC(LOC,TYP,WHERE,EXIT_TYPE) \
LOC = ( TYP * ) malloc( sizeof( TYP ) ) ; \
MEM_ERR(LOC,WHERE,EXIT_TYPE)
#define PAGC_CALLOC_STRUC(LOC,TYP,NUM,WHERE,EXIT_TYPE) \
LOC = ( TYP* ) calloc( (NUM) , sizeof( TYP ) ) ; \
MEM_ERR(LOC,WHERE,EXIT_TYPE)
#define PAGC_CALLOC_2D_ARRAY(PTR,TYP,ROWS,COLS,WHERE,EXIT_TYPE) \
{ \
TYP **temp_ptr ; \
int row_num ; \
PAGC_CALLOC_STRUC(temp_ptr,TYP*,ROWS,WHERE,EXIT_TYPE) ; \
for ( row_num = 0 ; row_num < ROWS ; row_num++ ) { \
PAGC_CALLOC_STRUC(temp_ptr[row_num],TYP,COLS,WHERE,EXIT_TYPE) ; \
} \
PTR = temp_ptr ; \
}
#define FREE_AND_NULL(PTR) \
if (PTR !=NULL)\
{\
free (PTR) ; \
PTR = NULL ; \
}
#define PAGC_DESTROY_2D_ARRAY(PTR,TYP,ROWS) \
{ \
int row_num ; \
TYP *row_val ; \
for (row_num = 0;row_num < ROWS;row_num++)\
{\
if ((row_val = PTR[row_num]) != NULL) \
{\
FREE_AND_NULL(row_val);\
}\
}\
FREE_AND_NULL(PTR) ; \
}
/* ================ FILE OPEN MACROS ==================== */
/* -- changed so not to conflict with Windows def --*/
#define PAGC_FILE_OPEN(HANDLE,FNAME,MODE,WHERE,RET) \
if ( ( HANDLE = fopen( FNAME , \
MODE ) ) == NULL ) { \
RET_ERR1( "\nCan't open: %s\n" ,FNAME,WHERE,RET) ; \
}
#define OPEN_ALLOCATED_NAME(ALLOC_NAME,EXT,HANDLE,NAME,MODE,DS_SYS,WHERE,RET) \
if ( ( ALLOC_NAME = ds_alloc_file_name(DS_SYS,NAME,EXT) ) == NULL ) { \
return RET ; \
} \
PAGC_FILE_OPEN(HANDLE,ALLOC_NAME,MODE,WHERE,RET)
#define SPACE_APPEND_WITH_LEN( D, S , L ) \
char_append( " " , D , S , L )
/* ================ SOUNDEX MACROS ==================== */
#define MAKE_SOUNDEX_KEY(DEST,CNT,SW) \
BLANK_STRING(DEST); \
for ( CNT = 0 ; CNT < MAXPHRASE ; CNT++ ) { \
if ( SW[ CNT ][ 0 ] == SENTINEL ) break ; \
COMMA_APPEND_WITH_LEN( DEST , SW[ CNT ] , MAXSTRLEN ) ; \
}
/* construct concatenated keys for the concat index */
#define MAKE_CONCAT_KEY(TARGET,SOURCE_A,SOURCE_B) \
BLANK_STRING(TARGET) ; \
strcpy( TARGET , SOURCE_A ) ; \
COMMA_APPEND_WITH_LEN( TARGET , SOURCE_B , MAXSTRLEN )
#define MAKE_CONCAT_SOUNDEX_KEY(SOURCE_A,SOURCE_B,DEST,HOLD,CNT,SW) \
soundex_street_words( SOURCE_A, SW) ; \
MAKE_SOUNDEX_KEY(DEST,CNT,SW) ; \
soundex_street_words( SOURCE_B, SW) ; \
MAKE_SOUNDEX_KEY(HOLD,CNT,SW) ; \
COMMA_APPEND_WITH_LEN(DEST,HOLD,MAXSTRLEN)
#define RNF_SENTINEL '_'
/* 2011-01-14 : interpret initial space in a field to indicate a blank field */
#define IS_ALPHA_STR_SENTINEL(V) ( ( *V == SENTINEL ) || ( *V == RNF_SENTINEL ) || ( *V == SPACE ) )
/* --------------------------------------------------
macros for converting and verifying pagc_client args
-----------------------------------------------------*/
#define HANDLE_CHECK 1014
#define CONVERT_HANDLE( NATIVE_PTR , CLIENT_PTR ) \
if ( CLIENT_PTR == NULL ) return FALSE ; \
NATIVE_PTR = ( CLIENT_HANDLE * ) CLIENT_PTR ; \
if ( NATIVE_PTR -> handle_check != HANDLE_CHECK ) return 0
#define CHECK_BOUNDS( ARRAY_SIZE , ARRAY_IDX ) \
if ( ( ARRAY_IDX > ARRAY_SIZE ) || (ARRAY_IDX < 1 ) ) { \
CLIENT_ERR( pagc_p -> global_record -> process_errors ) ; \
RET_ERR1( "No such entity such as %d" , \
ARRAY_IDX , \
pagc_p -> global_record -> process_errors , \
0 ) ; \
}
#define CHECK_BOUNDS_ABSOLUTE( ARRAY_SIZE , ARRAY_IDX ) \
if ( ( ARRAY_IDX >= ARRAY_SIZE ) || (ARRAY_IDX < 0 ) ) { \
CLIENT_ERR( pagc_p -> global_record -> process_errors ) ; \
RET_ERR1( "No such entity such as %d" , \
ARRAY_IDX , \
pagc_p -> global_record -> process_errors , \
0 ) ; \
}
#define UPDATE_SCHEMA_BOUNDS( PTR ) \
pagc_p -> schema_records[ pagc_p -> num_schemas ] = PTR ; \
pagc_p -> num_schemas++ ; \
return( pagc_p -> num_schemas )
#define UPDATE_CONTEXT_BOUNDS( PTR ) \
pagc_p -> context_records[ pagc_p -> num_contexts ] = PTR ; \
pagc_p -> num_contexts++ ; \
return( pagc_p -> num_contexts )
#define SCHEMA_INDEX_TO_POINTER( IDX , PTR ) \
PTR = pagc_p -> schema_records[ IDX - 1 ]
#define CONTEXT_INDEX_TO_POINTER( IDX , PTR ) \
PTR = pagc_p -> context_records[ IDX - 1 ]
#define LIMIT_BOUNDS( CNT, MAX ) \
if ( CNT == MAX ) { \
RET_ERR1( "%d exceeds maximum allowed" , \
CNT , \
pagc_p -> global_record -> process_errors , \
0 ) ; \
}
/* ================== BETA READ MACROS ================ */
#define READ_BETA_STRING(DEST,NUM) \
DEST = ds_attribute_read_string_field( ctx_p -> _beta_attribute_interface , row_num , att -> rs_fld_idx[ NUM ] ) ; \
if ( DEST == NULL ) return FALSE
#define READ_BETA_INT(DEST,NUM) \
DEST = ds_attribute_read_integer_field( ctx_p -> _beta_attribute_interface , row_num , att -> rs_fld_idx[ NUM ] ) ; \
if ( DEST == ERR_FAIL ) return FALSE
#define INT32_AS_BYTES( PTR_VAL ) \
* ( ( int32_t * ) ( PTR_VAL ) )
#define INTEGER_AS_BYTES( PTR_VAL ) \
* ( ( int * ) ( PTR_VAL ) )
#define DOUBLE_AS_BYTES( PTR_VAL ) \
*( ( double * ) ( PTR_VAL ) )
/* ================= floating point comparison macros ======== */
#define R_ERR .00001
#define IS_DOUBLE_EQUAL( FX, FY ) ( ( fabs( FX - FY ) <= R_ERR )? TRUE : FALSE )
#define IS_DOUBLE_NOT_EQUAL(FX,FY) ( ( fabs( FX - FY ) > R_ERR )? TRUE : FALSE )
#define IS_DOUBLE_LESS(FX,FY) ( ( ( FX - FY ) < R_ERR )? TRUE : FALSE )
#define IS_DOUBLE_GREATER(FX,FY) ( ( ( FX - FY ) > R_ERR )? TRUE : FALSE )
#define IS_DOUBLE_LESS_OR_EQUAL(FX,FY) ( ( ( FX - FY ) <= R_ERR )? TRUE : FALSE )
#define IS_DOUBLE_GREATER_OR_EQUAL(FX,FY) ( ( ( FX - FY ) >= R_ERR )? TRUE : FALSE )
#endif
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.